LinkedList如何跟踪所有节点-C#?

时间:2018-08-06 04:46:36

标签: c# .net data-structures linked-list singly-linked-list

我一直在努力开发自己的单链列表,我不明白如何在链列表的末尾插入节点?

代码如下:

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吗?如果不是,那为什么呢?

3 个答案:

答案 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)

链表的实现有很多方面。但是,对于一个简单的单链接列表,我们这样认为

enter image description here

如果我正确理解你,这是你不理解的部分

// 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的引用。

执行此操作的唯一方法是再次迭代链。

为了简化操作,我们可以实现双向链表,以便更轻松地找到其父级

enter image description here

更新

  

我不明白的是,为什么到下一个节点的链接不丢失   当前持有该信息的人每次都会更新以下内容   头。

在上文中,将current视为一个临时变量,其唯一的工作就像链中下一个链接的临时标记一样,

当我们称呼它

current = current.next;

所有操作都在抓取current.next中的内容,并再次针对循环条件保留该内容。我们可以调用它而不会破坏current.next

中的内容

最后一次,当我们在current.next中什么都没有找到时 也就是说,当循环检查current.next== null时,我们可以安全地将临时节点放入其中current.next = temp; <==无论如何它都是空的

答案 2 :(得分:0)

您创建LinkedList的新实例。

list.AddLast(3);-> headnull,您创建了一个新的Node并将其分配给head

list.AddLast(5);->创建一个新的Node temp并将5赋值。请记住,head的{​​{1}} = value3next。创建一个名为null的新变量,该变量指向currenthead然后遍历树,如果while的{​​{1}}不为空,则将current的{​​{1}}重新分配给该next。在这种情况下,current循环不会运行,因为next的{​​{1}}为空,所以它所做的只是将node分配给您的while节点。此时,我们有headnext

head.next->与上面相同,但是现在运行current循环。它会一直遍历以找到没有head.value = 3值的head.next = new Node(5, null);并将其分配给list.AddLast(4);。至此,我们有了while