我想把我的头放在链接列表上,这里有以下代码示例:
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变量。
很抱歉,如果这可能是一个愚蠢的问题,但是我只是不知道它是如何工作的。
谢谢
答案 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;
}