c# Single Linked list 这究竟是如何工作的

c# Singly Linked list how exacly this works


我无法理解这段代码的某些部分...
我想这是关于如何通过引用存储值,我的问题主要是关于方法:InsertDataAtTheEnd:我不明白变量 temp 如何影响变量 head,因为它被 while 循环越来越多地截断....最后是影响头部的 temp.next 的赋值。 类似的情况发生在方法 DelteNodeByValue 中。

谁能给我解释一下,或者出示一些材料来简单解释这里发生了什么?:(

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApp8
{
    class SinglyLinkedList 
    {
        public Node head { get; set; }
       


        public void InsertDataAtTheBeggining(int data)
        {

            Node newNode = new Node(data);
            newNode.next = head;
            head = newNode;


        }


        public void InsertDataAtTheEnd(int data)
        {
            Node temp = head;
            while (temp.next != null)
            {
                temp = temp.next;
            }

            Node newNode = new Node(data);
            // Node lastElement = GetLastElement(this);
            temp.next = newNode;

        }


         Node GetLastElement(SinglyLinkedList List)
        {
    
            Node temp = head;
            while (temp.next != null)
            {
               
                temp = temp.next;
            }

            return temp;

        }

         void DelteNodeFromEnd()
        {
            Node lastElement = GetLastElement(this);



        }


        public void DelteNodeByValue(int value)
        {
            var temp = head;
            Node previusly = null;
            if (temp != null && temp.data == value) // w przypadku jesli chce sie usunac pierwszy element listy;
            {
                head = temp.next;
                return;
            }

            while (temp != null && temp.data != value)
            {
                previusly = temp;
                temp = temp.next;
            }

            if (temp == null)
            {
                return;
            }

            previusly.next = temp.next;
        }


        public void DelteNodeFromBeggining()
        {


            head = head.next;




        }


        public void ShowAllData()
        {
            Node holder = head;
            while (holder != null)
            {
                Console.WriteLine(holder.data);
                holder = holder.next;
            }




        }


       internal class Node
        {
           public int data;
          public  Node next;
            public Node(int d)
            {
                data = d;
                next = null;
            }
        }



    }
}

就我个人而言,我不会像那样在 C# 中实现链表,(我认为代码中也有一些错误)。可能根本不是, 考虑内置于 System.Collections.Generic 中的通用双向链表结构 LinkedList 和 LinkedListNode。 尽管如此,了解幕后的概念非常重要,所以我会尝试为您解释有问题的代码段。

InsertDataAtEnd() 方法由几个步骤组成:
1.

Node temp = head;

head表示对链表第一个节点的引用。 当我们将 temp 声明为 head 时,我们实际上是在将 temp 设置为对列表第一个节点的另一个引用。即,head 和 temp 现在都指向列表的第一个节点。它们指向内存中的同一个地方。 例如,对于值为 5->7->4->2 的链表:

2.

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

我们提前指向列表的最后一个元素。我们通过 使用最后一个元素的下一个属性为空的事实。 因此,我们将指针前进,直到它指向的节点的下一个属性为空。 所以在这个阶段之后,head 仍然指向第一个节点,next 指向列表的最后一个元素。

这两个阶段在您的 GetLastElement() 方法中基本上是同一件事。 3.

 Node newNode = new Node(data);
 temp.next = newNode;

我们使用指定的数据创建一个新节点,并声明 temp 的 next 属性指向该新节点。由于 temp 指向最后一个元素,它的 next 属性为 null,现在它是新元素。所以新节点现在已经成为最后一个元素。