C#實現(xiàn)鏈表

鏈表是一種常見的數(shù)據(jù)結(jié)構(gòu),通常由兩部分組成,


image.png

存儲值的部分和存儲指針的部分,值部分可以任意存儲數(shù)組字符串以及一些其他的數(shù)據(jù)結(jié)構(gòu)。指針部分用來指向鏈表的其他元素,是有向的,A指向B的指針不能用這個指針實現(xiàn)B指向A,但是可以創(chuàng)建一個B指向A的指針。

更多鏈表的知識見 僅供參考

現(xiàn)在用C#來實現(xiàn),創(chuàng)建一個類,有值,有指針。

        public class LinkedListNode//鏈表
        {
            public LinkedListNode(object value)//存儲值
            {
                value = value;
            }
            public object Value { get; private set; }//值
            public LinkedListNode Next { get; internal set; }//指向下一個
            public object Prev { get; internal set; }//指向上一個
        }

然后需要補充一些細(xì)節(jié),如頭鏈表,尾鏈表。修改鏈表,讀取鏈表方法

public class LinkedList : IEnumerable//IEnumerable 是 .NET 的接口,用于實現(xiàn)迭代
  {
    public LinkedListNode First { get; private set; }//鏈表頭
    public LinkedListNode Last { get; private set; }//鏈表尾

    public LinkedListNode AddLast(object node)//創(chuàng)建鏈表
    {
      var newNode = new LinkedListNode(node);//對鏈表數(shù)量化
      if (First == null)//如果頭為空
      {
        First = newNode;//讓鏈表頭為新鏈表
        Last = First;//鏈表頭和鏈表尾相等
      }
      else//如果鏈表頭部位空
      {
        Last.Next = newNode;//尾鏈表的下一個元素為新鏈表
        Last = newNode;//尾鏈表尾新鏈表
      }
      return newNode;//返回鏈表
    }

    public IEnumerator GetEnumerator()//迭代方法獲取鏈表
    {
      LinkedListNode current = First;//獲取鏈表頭
      while (current != null)//當(dāng)前鏈表不為空
      {
        yield return current.Value;//迭代返回鏈表的下一個元素
        current = current.Next;//當(dāng)前元素為下一個元素
      }
    }
  }

其中讀取鏈表涉及 枚舉器,詳情見 c#數(shù)組和元組

然后就可以對鏈表進行操作
完整代碼如下

using System;
using System.Collections;
using static System.Console;


namespace ConsoleApp20
{
   class Program
   {
       public class LinkedListNode
       {
           public LinkedListNode(object value)
           {
               Value = value;
           }
           public object Value { get; set; }//值
           public LinkedListNode Next { get; internal set; }//指向下一個
           public LinkedListNode Prev { get; internal set; }//指向上一個
       }
       public class LinkedList : IEnumerable//IEnumerable 是 .NET 的接口,用于實現(xiàn)迭代
       {
           public LinkedListNode First { get; set; }//鏈表頭
           public LinkedListNode Last { get; set; }//鏈表尾

           public LinkedListNode AddLast(object node)//創(chuàng)建鏈表
           {
               var newNode = new LinkedListNode(node);//對鏈表數(shù)量化
               if (First == null)//如果頭為空
               {
                   First = newNode;//讓鏈表頭為新鏈表
                   Last = First;//鏈表頭和鏈表尾相等
               }
               else//如果鏈表頭部位空
               {
                   Last.Next = newNode;//尾鏈表的下一個元素為新鏈表
                   Last = newNode;//尾鏈表尾新鏈表
               }
               return newNode;//返回鏈表
           }
           public IEnumerator GetEnumerator()//迭代方法獲取鏈表
           {
               LinkedListNode current = First;//獲取鏈表頭
               while (current != null)//當(dāng)前鏈表不為空
               {
                   yield return current.Value;//迭代返回鏈表的下一個元素
                   current = current.Next;//當(dāng)前元素為下一個元素
               }
           }
       }
       static void Main(string[] args)
       {
           var list1 = new LinkedList();
           list1.AddLast(2);//為鏈表賦值
           list1.AddLast(3.14);//為鏈表賦值
           list1.AddLast("asdw");//為鏈表賦值

           WriteLine(list1.First.Value);//輸出鏈表頭
           list1.First.Value = 100;//改變鏈表頭的值
           WriteLine(list1.First.Next.Value);//輸出鏈表頭的下一個元素

           LinkedListNode b = list1.First.Next;//指定鏈表中元素
           WriteLine(b.Value);//輸出值

           b.Prev = list1.First;//將鏈表元素b的上一個元素指向鏈表頭,
           //注意,這里是必須的,因為在為鏈表賦值時使用的向下一個元素的指針完成的
           //但是沒有定義是一個元素是什么,指針是單向的,所以使用上一個元素指針必須指定
           WriteLine(b.Prev.Value);
           WriteLine("***************");
            foreach (var i in list1)//迭代鏈表中所有元素。
           {
               WriteLine(i);
           }
           WriteLine("****************");
           LinkedListNode c = b.Next;//指定當(dāng)前鏈表的最后一個元素
           c.Next = list1.First;//使其指向鏈表頭,實現(xiàn)鏈表頭尾相連
           foreach (var i in list1)//這時會形成死循環(huán),一直輸出,直到計算機崩潰
           {
               WriteLine(i);
           }
           ReadKey();
       }

   }
}

一些注意事項

  • 對鏈表迭代需要先生成枚舉器
  • 鏈表指針是單向的
  • 上述代碼中沒有實現(xiàn)返回通過指向下一個元素的指針實現(xiàn)指向上一個元素的指針,因此使用是指向上一個元素的指針需要手動指定。
  • 盡量不要對有環(huán)鏈表迭代。

可以通過對屬性的修改完成鏈表的只讀操作。public object Value { get; set; }

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容