我一直在努力开发自己的单链列表,我不明白如何在链列表的末尾插入节点?
代码如下:
class LinkedList
{
private Node head;
public void AddLast(int value)
{
if (head == null)
{
head = new Node();
head.value = value;
head.next = null;
}
else
{
Node temp = new Node();
temp.value = value;
Node current = head;
while (current.next != null)
{
current = current.next;
}
current.next = temp;
}
}
public void PrintAll()
{
Node current = head;
while (current != null)
{
Console.WriteLine(current.value);
current = current.next;
}
}
}
这是主要方法
static void Main(string[] args)
{
LinkedList list = new LinkedList();
list.AddLast(3);
list.AddLast(5);
list.AddLast(4);
}
1)我完全得到了第一部分列表。AddLast(3)。由于head为空,我们创建一个新的节点head并为其分配值。
2)调用list.AddLast(5)时,head不再为null,因此我们创建了一个新的临时节点,并为其分配值。现在我们创建一个新的当前节点来保存Head的值,需要注意Head.Next为空。
现在,我们遍历current并将temp节点放置到current.Next。
3)现在,在调用list.AddLast(5)时,是否不应该用Head的内容再次覆盖当前值?分别是Head.Value = 3和Head.Next = Null。
所以它不应该current.Value = 3并且Current.Next = Null吗?如果不是,那为什么呢?
答案 0 :(得分:2)
Node current = head;
执行以上语句时,current
暂时仅被分配head
的引用,而没有赋值。因此,current
当时仅指向head
。如果在此语句后执行,current.value
将为您提供head
的值。
while (current.next != null)
{
current = current.next;
}
现在,当执行以上while
循环时,它将循环访问链接列表,并将当前节点带到链接列表中的最后一个节点,该节点将具有current.next = null
。
current.next = temp;
执行以上语句时,新节点将添加到链表的最后一个。
答案 1 :(得分:0)
链表的实现有很多方面。但是,对于一个简单的单链接列表,我们这样认为
如果我正确理解你,这是你不理解的部分
// All this part of the method does is add the new value to the end of the list
// create node
Node temp = new Node();
// assign its value
temp.value = value;
// now we want to start with the head and follow
// the chain until we find the last node
Node current = head;
// has it got a next element
while (current.next != null)
{
// if so change current to next and look again
current = current.next;
}
// yay no more nexts, lets add temp here
current.next = temp;
// you have effectively added your new element to the end of the list
要说另一种常见的实现方式是将Last
/ Current
节点保存在类中(就像处理head一样)。
在这种情况下,我们无需遍历整个链,而是可以引用该 Node ,而只需添加其下一个并更新类中的Last
引用即可。但是,当我们必须删除最后一项时,我们不仅要记住类中的null
Last
,还要记住null
的父项Next
的引用。
执行此操作的唯一方法是再次迭代链。
为了简化操作,我们可以实现双向链表,以便更轻松地找到其父级
更新
我不明白的是,为什么到下一个节点的链接不丢失 当前持有该信息的人每次都会更新以下内容 头。
在上文中,将current
视为一个临时变量,其唯一的工作就像链中下一个链接的临时标记一样,
当我们称呼它
current = current.next;
所有操作都在抓取current.next
中的内容,并再次针对循环条件保留该内容。我们可以调用它而不会破坏current.next
最后一次,当我们在current.next
中什么都没有找到时
也就是说,当循环检查current.next== null
时,我们可以安全地将临时节点放入其中current.next = temp;
<==无论如何它都是空的
答案 2 :(得分:0)
您创建LinkedList
的新实例。
list.AddLast(3);
-> head
是null
,您创建了一个新的Node
并将其分配给head
。
list.AddLast(5);
->创建一个新的Node
temp
并将5
赋值。请记住,head
的{{1}} = value
和3
是next
。创建一个名为null
的新变量,该变量指向current
。 head
然后遍历树,如果while
的{{1}}不为空,则将current
的{{1}}重新分配给该next
。在这种情况下,current
循环不会运行,因为next
的{{1}}为空,所以它所做的只是将node
分配给您的while
节点。此时,我们有head
,next
head.next
->与上面相同,但是现在运行current
循环。它会一直遍历以找到没有head.value = 3
值的head.next = new Node(5, null);
并将其分配给list.AddLast(4);
。至此,我们有了while