#c# #linked-list
#c# #связанный список
Вопрос:
Теперь я немного путаюсь между этими 2 кодами:
node = node.next;
node.next = node;
public class ListNode
{
public int val;
public ListNode next;
public ListNode(int x) { val = x; }
}
Похоже, что оба они каким-то образом работают нормально, но функционируют по-разному. Я не путаю между ними, может ли кто-нибудь объяснить разницу для меня?
Спасибо
Комментарии:
1. Какая часть вас смущает? Как вы думаете, в чем разница? Попробуйте что-то вроде
var node = new ListNode (1); node.next = new ListNode(2);
. Затем попробуйте две строки, которые вас смущают, и посмотрите, в чем разница. Если вы все еще в замешательстве, пожалуйста, задайте более конкретный вопрос.2. Произносится
=
как «становится». Этоa=b
противb=a
.3. @RufusL Насколько я понимаю, node = node.next означает, что я меняю указатель на следующий узел, node.next = node означает, что я связываю свой узел с узлом.
4. @HenkHolterman Спасибо, это работает.
Ответ №1:
Вы не предоставили большого контекста, но допустим, у нас есть следующий LinkedList: a->b->c-> d-> e (символы представляют ListNodes, а стрелка — next
свойство).
И тогда у нас есть ListNode node
переменная, указывающая на узел c
внутри списка.
(1) Первое присвоение node = node.next
ничего не меняет в исходном списке, но изменяет значение node
. После назначения LinkedList остается в: a->b->c-> d-> e и node
указывает на d
(2) Другое назначение node.next = node
изменяет список. Остальная часть списка (d, e) отбрасывается, и c начинает указывать на себя навсегда: a->b->c->c->c->c-> c .. node
остается указывающим на c
Комментарии:
1. Вы должны упомянуть, что в (1) после выполнения
node = node.next
это, еслиnode
первоначально указывает наc
этоnode
, теперь будет указывать наd
.2. Аналогично, для (2) упомяните, что
node
все еще указывает наc
. Вы установили, что это, безусловно, образует замкнутый цикл в списке, где c-> c , но не упомянули о том, что происходит (или не происходит) сnode
переменной. (Вы только что внесли изменение. спасибо)