2016-11-13 2 views
-4

Изучение некоторых связанных списков и не уверен, как этот цикл работает с назначением.Может кто-нибудь объяснить мне, как этот цикл работает только внутри функции?

Код предназначен для нахождения пересечения двух связанных списков.

ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { 
    ListNode *cur1 = headA, *cur2 = headB; 
    while(cur1 != cur2){ 
     cur1 = cur1 ? cur1->next : headB; 
     cur2 = cur2 ? cur2->next : headA; 
    } 
    return cur1; 
} 

Я не знаю, как cur1 = cur1 оценивается с назначениями, а не логическое условие. Я понимаю, как итерация работает, но не знает, почему я не могу просто сделать:

while(cur1 != cur2){ 
    cur1 = cur1->next; 
    cur2 = cur2->next; 
} 
return cur1; 

С этим я вполне уверен, что я в конечном итоге с ошибкой времени выполнения, хотя.

+2

«Может кто-нибудь объяснить мне, как работает эта петля if else?» - нет никакого 'if..else' в вашем коде – artm

+1

' cur1 = cur1' - это не то, что он говорит. Он говорит: «cur1 = (cur1? Cur1-> next: headB);» ... другими словами, он проверяет, имеет ли значение «cur1» значение null перед разыменованием. Во втором цикле 'while', если' cur1' или 'cur2' имеет значение null, вы сработаете. – par

+0

ах это действительно очень полезно, потому что, если я не использовал это, у меня были проблемы с получением моих программ для компиляции спасибо! @par – johnson

ответ

4
cur1 = cur1?cur1->next:headB; 

Является тройным оператором. Он проверяет, если cur1 равно нулю, прежде чем пытаться «перейти к следующему узлу» Это эквивалентно:

if (cur1 != null){cur1 = cur1->next;} 
else {cur1 = headB;} 

Проблема с версией, предложенной вам, что если cur1 случается быть пустым, вы получите ошибка сегментации.

Смежные вопросы