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,现在它是新元素。所以新节点现在已经成为最后一个元素。
我无法理解这段代码的某些部分...
我想这是关于如何通过引用存储值,我的问题主要是关于方法: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;
}
我们提前指向列表的最后一个元素。我们通过
使用最后一个元素的下一个属性为空的事实。
因此,我们将指针前进,直到它指向的节点的下一个属性为空。
这两个阶段在您的 GetLastElement() 方法中基本上是同一件事。 3.
Node newNode = new Node(data);
temp.next = newNode;
我们使用指定的数据创建一个新节点,并声明 temp 的 next 属性指向该新节点。由于 temp 指向最后一个元素,它的 next 属性为 null,现在它是新元素。所以新节点现在已经成为最后一个元素。