Основные сведения о LinkedList - PullRequest
0 голосов
/ 28 февраля 2019

Я пытаюсь обернуть голову вокруг связанных списков, и у меня есть этот пример кода здесь:

public class SinglyLinkedListNode {
    public int data;
    public SinglyLinkedListNode next;

    public SinglyLinkedListNode(int data) {
        this.data = data;
        this.next = null;
    }

    public void Print() {
        Console.WriteLine(data);
        if(next != null) {
            next.Print();
        }
    }
}

public class SinglyLinkedList {
    public SinglyLinkedListNode headNode;

    public SinglyLinkedList() {
        headNode = null;
    }

    public void Print() {
        if(headNode != null) {
            headNode.Print();
        }
    }
}

class Program {
    static void Main(string[] args) {
        SinglyLinkedList list = new SinglyLinkedList();
        int listCount = 5;
        for(int i = 0; i < listCount; i++) {
            int listItem = i + 1;
            SinglyLinkedListNode list_head = InsertNodeAtTail(list.headNode, listItem);
            list.headNode = list_head;
        }

        list.Print();
    }

    static SinglyLinkedListNode InsertNodeAtTail(SinglyLinkedListNode head, int data) {
        if (head == null) {
            head = new SinglyLinkedListNode(data);
            return head;
        } else {
            var temp = head;
            while (temp.next != null) {
                temp = temp.next;
            }

            temp.next = new SinglyLinkedListNode(data);
            return head;
        }
    }
}

в методе InsertNodeAtTail в операторе else, где он в основном хранит переданный в headNode как временныйпеременная и в самом ее конце она устанавливает временные переменные, следующий указатель на новые данные, которые передаются, и затем возвращает заголовок.В этом сценарии как head отслеживает изменения в переменной temp?

Когда я отлаживаю это и проверяю возвращаемое значение head, в нем есть все изменения, которые я сделал с переменной temp, но значение head никогда не былодействительно изменено / использовано, кроме той части, где оно присваивается переменной temp.

Пример, скажем, мы получили список 1 -> 3 -> 5 -> и добавление в 6 6 добавляется в temp.next и при возврате head значение head содержит 1 -> 3 -> 5 -> 6, но мы никогда ничего не делали для head?Все изменения были внесены в переменную temp.

Извините, если это глупый вопрос, но я просто не понимаю, как это работает.

Спасибо

1 Ответ

0 голосов
/ 28 февраля 2019

Когда я отлаживаю это и проверяю возвращаемое значение заголовка, в нем есть все изменения, которые я внес в переменную temp, но значение заголовка действительно никогда не изменялось / не использовалось, за исключением части, где оно назначается временному значению.переменная.

temp является ссылкой на SinglyLinkedListNode.

Когда вы вызываете следующий код, он продолжает изменять ссылку temp на следующую SinglyLinkedListNodeв цепочке, пока не дойдете до последнего узла.На данный момент temp ссылается на 5 в вашем примере, и добавляет ваши новые 6 в конце.В голову не вносятся никакие изменения.

Поскольку это цепочка 1 -> 3 -> 5, добавление 6 к концу влияет на всю цепочку и теперь становится 1-> 3 -> 5 -> 6.

var temp = head;

while (temp.next != null) {
    temp = temp.next;
}
...