Я только недавно попал в связанные списки, и я добавляю свою собственную функцию «добавить в конец».

void insert_at_end(Node** head, Node* node)
{
    Node* temp;

    temp = *head;

    if (temp == NULL) // linked list is empty
    {
        *head = node;
    }
    else
    {
        while (temp->pNext != NULL)
        {
            temp = temp->pNext;
        }
    temp->pNext = node;
    }
}

Первоначально я делал temp != NULL вместо temp->pNext != NULL, потому что я так думал, что это приведет меня к самому последнему узлу, так как он останавливает цикл, когда у temp все еще есть данные, прежде чем он достигнет NULL. Разве temp->pNext != NULL не остановится на втором и последнем узле? Так как он останавливает зацикливание, когда понимает, что следующий указатель последнего узла равен NULL, он не перемещается на этот узел?

Спасибо, ребята, если мне нужно что-то прояснить из этого слова, рвота, дайте мне знать.

c
1
BobbyT432 11 Фев 2020 в 09:08

2 ответа

Лучший ответ

Разве temp->pNext != NULL не остановится на втором-последнем узле?

Нет. Вот графическое изображение для простоты понимания.

С temp != NULL temp будет указывать на NULL:

 +---+    +---+    +---+
 | 1 |--->| 2 |--->| 3 |---> NULL
 +---+    +---+    +---+      ^
                              |
                             temp

Как вы видите, temp выполняет итерацию до тех пор, пока не станет NULL, после чего вы не можете ничего присоединить к конечному узлу, потому что вы прошли его.


С temp->pNext != NULL temp будет указывать на последний узел.

 +---+    +---+    +---+
 | 1 |--->| 2 |--->| 3 |---> NULL
 +---+    +---+    +---+
                     ^
                     |
                    temp

Здесь temp будет повторяться до следующего узла NULL. Это означает, что вы указываете на последний узел, и вы можете использовать этот указатель, чтобы настроить этот узел так, чтобы он указывал на новый узел с temp->pNext = node:

 +---+    +---+    +---+    +---+
 | 1 |--->| 2 |--->| 3 |--->| 4 |---> NULL
 +---+    +---+    +---+    +---+
                     ^
                     |
                    temp

Кроме того, вы можете также захотите добавить дополнительную безопасность, гарантируя, что узлу, которому вы дали очки, NULL, в случае если вызывающая сторона может забыть это сделать. Это так же просто, как добавить эту строку в начало функции:

node->pNext = NULL;
4
paxdiablo 11 Фев 2020 в 06:44

Давайте проведем аналогию.

  • Каждый узел - это станция.
  • NULL ваша остановка.
  • while (temp->pNext != NULL) { temp = temp->pNext; } означает поездку и посещение каждой станции, пока не достигнете станции остановки.
  • Когда вы достигнете станции остановки, temp->pNext = node; необходимо добавить дополнительную станцию

Теперь прежняя остановочная станция, за которой следует новая добавленная остановочная станция (неявно новая NULL) не остановочная станция, а предпоследняя станция, которую необходимо посетить.

1
snr - Reinstate Monica 11 Фев 2020 в 06:36