Здесь происходит вся магия:
1. temp2 = startPTR;
2. while( temp2->next != NULL )
3. temp2 = temp2->next;
4. temp2->next = temp1;
Сначала temp2
будет указывать на начало списка.В строках 2 и 3 вы изменяете temp2
на следующий узел, пока не достигнете узла, где temp2->next
равно NULL
.Этот узел является последним узлом списка, независимо от размера списка.
Наконец, в строке 4 вы изменяете temp2->next
на temp1
, поэтому теперь он указывает на новый узел (последнийузел теперь указывает на новый узел).temp1->next
также NULL
, поэтому temp1
теперь представляет конец списка.
После строки 1 у вас есть
start = addr1;
|
V
(addr1) ----> (addr2) ----> (NULL)
^
|
temp2
temp2->next
не NULL
(это addr2), поэтому вы повторяете и выполняете строку 3 и получаете:
start = addr1;
|
V
(addr1) ----> (addr2) ----> (NULL)
^
|
temp2
temp2->next
теперь NULL
.Таким образом, вы останавливаете цикл и выполняете строку 4 и получаете:
start = addr1;
|
V
(addr1) ----> (addr2) ----> (addr3) ----> (NULL)
^ ^
| |
temp2 temp1
Примечание : Знаете ли вы, как работают указатели?Представьте себе: у вас есть узел, который содержит некоторые данные в памяти.Когда у вас есть переменные в памяти, эти переменные имеют адреса.Допустим, addr1 равен 10, addr2 равен 150, а addr3 (который является узлом просто new
ed) равен 60. start
имеет значение 10. Следовательно, «указывая» на первый узел списка (который использует этот адресУ вас есть доступ к своим данным).Одним из таких данных является поле next
.Поле next
первого узла имеет значение 150, что указывает на следующий узел.Когда вы говорите temp2 = start
, вы помещаете число 10 в temp2
, в этот момент temp2->next
имеет значение 150. Когда вы говорите temp2=temp2->next
, вы просто помещаете значение 150 в temp2
, перезаписывая предыдущее значение.Таким образом, вы эффективно переместили свой указатель с указателя на первый узел, чтобы теперь указывать на второй узел.Теперь temp2->next
равно NULL
(то есть 0).Когда вы теперь говорите temp2->next=temp1
, вы вводите значение 60 в поле next
, равное temp2
.Так что теперь temp2->next
- это 60. temp2->next->next
- это NULL
.