难以理解的基本LinkedList

时间:2019-02-28 07:02:10

标签: c# .net linked-list

我想把我的头放在链接列表上,这里有以下代码示例:

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;
        }
    }
}

在else语句的InsertNodeAtTail方法中,它基本上将传入的headNode存储为临时变量,并在其末尾将临时变量设置为传入新数据的下一个指针,然后返回head。在这种情况下,head如何跟踪temp变量的变化?

当我调试此代码并检查返回的head值时,它具有我对temp变量所做的所有更改,但除了将其赋给temp变量的部分外,从未真正修改过/使用过head值。 / p>

例如,假设我们得到一个列表1-> 3-> 5->并添加了6 将6添加到temp.next中,并在返回标头上,标头值包含1-> 3-> 5-> 6,但我们从未做过任何标头操作吗?所有更改都针对temp变量。

很抱歉,如果这可能是一个愚蠢的问题,但是我只是不知道它是如何工作的。

谢谢

1 个答案:

答案 0 :(得分:0)

  

当我调试此代码并检查返回的head值时,它具有我对temp变量所做的所有更改,但除了将其赋给temp变量的部分外,从未真正修改过/使用过head值。 / p>

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;
}