当前位置: 首页 > 知识库问答 >
问题:

C#单链表实现

寿浩言
2023-03-14

在试图理解如何在C#中实现单个列表时,我遇到了下面的链接:

创建一个非常简单的链表。

然而,由于我是C#的新手,我被上面讨论的第一部分中列出的语法弄糊涂了。正在声明一个名为节点的类,并且在声明为“公共节点下一个”的类中还有另一个语句。这个语句称为构造函数吗?请帮忙。

public class Node {
    public Node next;
    public Object data;
 }

共有3个答案

夏雅志
2023-03-14

它是类场。参考:http://msdn.microsoft.com/en-us/library/ms173118.aspx

胡野
2023-03-14

有一种简单的方法可以创建单链表。让我们试着理解这个概念。如果概念清晰,那么您就可以理解逻辑本身。单链表的节点有两个部分。一个有数据值,另一个有下一个节点的参考地址。查看以下代码:

首先,我们需要创建链表节点类

/// <summary>
/// Creating the Real World Entity of Linked List Node
/// </summary>
public class LinkedListNode
{
    public Object Value { get; set; }

    public LinkedListNode Next { get; set; }

}

在这里,类有Value和Holder来保存序列中下一个节点的引用。接下来我们需要创建链接列表本身

/// <summary>
/// Creating the Linked List Class Itself. It defines the First and Last Nodes of Linked List
/// </summary>
public class LinkedList
{
    public LinkedListNode First { get; set; }
    public LinkedListNode Last { get; set; }

    /// <summary>
    /// Method to Add items into the Linked List
    /// </summary>
    /// <param name="_value"></param>
    public void AddToLinkedList(object _value)
    {
        LinkedListNode node = new LinkedListNode();
        node.Value = _value;

        if (First == null)
        {
            First = node;
            Last = node;
        }
        else
        {
            Last.Next = node;
            Last = node;
        }
    }

    /// <summary>
    /// Method to display all items. We can further implement the IEnumerable interface
    /// to Yield IEnumerator Interface.
    /// </summary>
    public void DisplayAllItems()
    {
        LinkedListNode current = First;
        while (current != null)
        {
            Console.WriteLine(current.Value);
            current = current.Next;
        }
    }
}

这里的关键是将项目添加到链接列表中。首先,我们需要检查链表是否存在。我们检查链接列表中的第一个或头节点。如果为空,则将节点指定为第一个入口点。在此阶段,最后一项是第一项本身。

这就是我们如何添加和显示项目

class Program
{
    static void Main(string[] args)
    {
        LinkedList singlyLinkedList = new LinkedList();
        singlyLinkedList.AddToLinkedList(4);
        singlyLinkedList.AddToLinkedList(5);
        singlyLinkedList.AddToLinkedList(7);
        singlyLinkedList.AddToLinkedList(2);
        singlyLinkedList.AddToLinkedList(1);
        singlyLinkedList.AddToLinkedList(10);

        singlyLinkedList.DisplayAllItems();
        Console.ReadLine();
    }
}

让我知道它是否有意义:)

司徒捷
2023-03-14

在一个简单的单链接列表实现中,Node类型包含对列表中下一项的引用,这就是您发布的Node类型中的Next字段所做的。此引用用于允许列表的迭代。

附加的LinkedList类(或任何您希望称之为它的类)将包含对列表中第一项的单个Node引用。从第一个节点开始,您可以通过获取下一个字段来遍历列表。当Next为null时,您就到达了列表的末尾。

以这段代码为例:

public class LinkedList
{
    public class Node
    {
        // link to next Node in list
        public Node next = null;
        // value of this Node
        public object data;
    }

    private Node root = null;

    public Node First { get { return root; } }

    public Node Last 
    {
        get
        {
            Node curr = root;
            if (curr == null)
                return null;
            while (curr.next != null)
                curr = curr.next;
            return curr;
        }
    }
}

First属性仅返回根节点,它是列表中的第一个节点。属性从根节点开始,逐步遍历列表,直到找到一个节点,该节点的下一个属性为null,指示列表的末尾。

这使得将项目追加到列表中变得简单:

public void Append(object value)
{
    Node n = new Node { data = value };
    if (root == null)
        root = n;
    else
        Last.next = n;
}

要删除节点,必须在列表中找到其前面的节点,然后更新该节点的next链接,指向要删除的节点后面的节点:

public void Delete(Node n)
{
    if (root == node) 
    {
        root = n.next;
        n.next = null;
    }
    else
    {
        Node curr = root;
        while (curr.next != null)
        {
            if (curr.next == n)
            {
                curr.next = n.next;
                n.next = null;
                break;
            }
            curr = curr.next;
        }
    }
}

您还可以执行一些其他操作,如在列表中的位置插入值、交换节点等。在节点之后插入是快速的,之前插入是缓慢的,因为您必须找到之前的节点。如果您真的想要快速插入之前,您需要使用一个双链接列表,其中Node类型具有下一个上一个链接。

要在评论中详细说明您的问题。。。

在C#中,所有类型都分为两种基本分类:值类型和引用类型。名称反映了它们在代码块之间传递的方式:值类型按值传递(值复制到新变量),而引用类型按引用传递(引用/指针复制到新变量)。不同之处在于,对值类型参数的更改对调用方的值副本没有影响,而对引用类型参数的更改将反映在调用方的引用副本中。

为变量赋值和引用也是如此。在以下情况下,a的值在b更改时不会更改:

int a = 0;
int b = a;
b = 1;

这是相当直观的。可能会让你大吃一惊的是,在C#astruct中也是一种值类型:

public struct test
{
    public string value;
}

static void Main()
{
    test a;
    a.value = "a";
    test b = a;
    b.value = "b";

    Console.WriteLine("{0} {1}", a.value, b.value);
}

上面将给出输出ab,因为当您将a分配给b时,已制作了一份副本。但如果我们更改类的结构:

public class test
{
    public string value;
}

static void Main()
{
    test a = new test(); // Note the 'new' keyword to create a reference type instance
    a.value = "a";
    test b = a;
    b.value = "b";
    Console.WriteLine("{0} {1}", a.value, b.value);
}

由于变量b引用的对象与变量a引用的对象相同,因此此处的输出将为b。这两个变量引用同一个对象。

如果您来自C/C或其他类似语言,可以将引用类型变量视为指针。这并不完全相同,C#确实有指针(它们隐藏在普通托管代码中),但已经足够接近了。在将其指向该类型的实例之前,它不是完全可用的。就像C/C中的char*一样,除非您将它指向某个地方,否则它并不是特别有用。

Joseph Alhabari(写了一篇关于值和引用类型的文章:C#概念:值与引用类型。这本书非常值得一读,就像他写的许多东西一样。我也强烈建议你考虑买一本他的C#坚果壳书。

 类似资料:
  • 本文向大家介绍C语言单链表的实现,包括了C语言单链表的实现的使用技巧和注意事项,需要的朋友参考一下 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。 链表结构: SList.h SList.cpp Test.cpp 以上内容是小编给大家介绍的C语言单链表的实现代码,希望对大家有所帮助!

  • 本文向大家介绍C语言实现单链表反转,包括了C语言实现单链表反转的使用技巧和注意事项,需要的朋友参考一下 一、理解指针 看懂链表的结构并不是很难,但是一旦把它和指针混在一起,就很容易让人摸不着头脑。所以,要想写对链表代码,首先就要理解好指针。   有些语言有“指针”的概念,比如 C 语言;有些语言没有指针,取而代之的是“引用”,比如 Java、Python。不管是“指针”还是“引用”,实际上,它们的

  • 本文向大家介绍C语言实现单链表实现方法,包括了C语言实现单链表实现方法的使用技巧和注意事项,需要的朋友参考一下 C语言实现单链表实现方法 链表和我们之前实现过的顺序表一样,都是简单的数据结构,链表分为单向链表、双向链表、循环链表。而单向链表又分为两种实现方法,一种为带头节点的单链表,一种为不带头节点的单链表。我们来具体看看不带头节点的单链表的实现 单链表:它是一种链式存储的线性表,用一组地址任意的

  • 本文向大家介绍C++ 实现静态链表的简单实例,包括了C++ 实现静态链表的简单实例的使用技巧和注意事项,需要的朋友参考一下 C++ 实现静态链表的简单实例 用数组描述的链表,即称为静态链表。 在C语言中,静态链表的表现形式即为结构体数组,结构体变量包括数据域data和游标cur。 这种存储结构,仍需要预先分配一个较大的空间,但在作为线性表的插入和删除操作时不需移动元素,仅需修改指针,故仍具有链式存

  • C语言面向对象编程(五):单链表实现 前面我们介绍了如何在 C 语言中引入面向对象语言的一些特性来进行面向对象编程,从本篇开始,我们使用前面提到的技巧,陆续实现几个例子,最后呢,会提供一个基本的 http server 实现(使用 libevent )。在这篇文章里,我们实现一个通用的数据结构:单链表。 这里实现的单链表,可以存储任意数据类型,支持增、删、改、查找、插入等基本操作。(本文提供的是完

  • 我已经用C#实现了单链表。任何人都可以查看下面的代码并指出我的错误所在吗? 此函数不删除最后一个节点。我不知道出了什么问题。当while循环结束时,curNode中的node引用的next为null。这意味着这是最后一个节点。最后,我将此节点设置为null。但当我使用显示功能时。它还显示最后一个节点。这不是删除最后一个节点。 这里是我的显示功能: