где указатель указывает, если я не объявляю его нулевым - PullRequest
0 голосов
/ 27 апреля 2018

Когда я делаю этот вопрос по leetcode:

class Solution {
    public ListNode reverseList(ListNode head) {
        Stack s = new Stack();

    ListNode curr = head;
    while (curr != null) {
        s.push(curr);
        curr = curr.next;
    }

    ListNode newHead = new ListNode(-1);
    ListNode track = newHead;
    while (!s.empty()) {
        track.next =(ListNode) (s.pop());
        track = track.next;
    }
    track.next = null;

    return newHead.next;
    }
}

Если у меня нет track.next = null, то код будет работать неправильно. Так что будем отслеживать. Далее указывается, если я не объявлю это, указывая на null?

Ответы [ 3 ]

0 голосов
/ 28 апреля 2018

Ну, вы переворачиваете связанный список. Допустим, список будет a-> b-> c

Вы кладете их в тайник. Теперь вы открываете их в обратном порядке и устанавливаете указатель.

Итак, c-> b-> a (---> это старое значение указателя a, указывающего на b)

Нам нужно c-> b-> a-> null

Вот почему track.next = null; требуется.

Что если мы его не используем?

Тогда связанный список, сформированный путем обращения, будет

c -> b -> a

   | ___|  (a pointing back to b)

Вот почему любой другой код, который обращается к такому обратному связанному списку, будет работать неправильно.

0 голосов
/ 28 апреля 2018

Если я правильно понял, вы переворачиваете связанный список, сначала помещая элементы в стек, начиная с его заголовка, а затем выталкивая элементы из стека, чтобы воссоздать ссылки в обратном порядке. Последний узел обратного списка будет первым узлом исходного списка. ТАК установить хвост обратного списка на ноль.

    ListNode newHead = new ListNode(-1);
    ListNode track = newHead;
    while (!s.empty()) {
        track.next =(ListNode) (s.pop());
        track = track.next;
    }
    #track is now pointing to the head (that was the first one pushed on to stack).
    track.next = null; # set the tail of reversed list to null.
0 голосов
/ 28 апреля 2018

Это потому, что вы даете track.next исходную ссылку на узел, которому уже присвоено значение next. Следуйте логике на этом примере:

Скажем, у вас есть ListNode размера 3, использующий узел 1 в качестве корня:

( 1 ) --> ( 2 ) --> ( 3 ) --> null

В вашей реализации вы берете каждый узел и добавляете его в стек следующим образом:

Узел -> next

|  3      null |  <--- Top of stack
|  2        3  |
|  1        2  |

Затем вы создаете новый узел newHead и начинаете выталкивать узлы из стека, присваивая значения вашему узлу следующим образом:

( 3 )  -->  ( 2 )  -->  ( 1 ) --> ( 2 )

Поскольку вы не обновили значение track.next для исходного заголовка списка, он по-прежнему указывает на узел 2. Но узел 2 теперь указывает на узел 1, поэтому вы попали в бесконечный цикл. Позвонив по номеру track.next = null, вы измените вышеприведенное, чтобы оно выглядело так:

( 3 ) --> ( 2 ) --> ( 1 ) --> null
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...