C#實(shí)現(xiàn)鏈表

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


image.png

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

更多鏈表的知識(shí)見(jiàn) 僅供參考

現(xiàn)在用C#來(lái)實(shí)現(xiàn)劣针,創(chuàng)建一個(gè)類校镐,有值,有指針捺典。

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

然后需要補(bǔ)充一些細(xì)節(jié)鸟廓,如頭鏈表,尾鏈表站叼。修改鏈表氨菇,讀取鏈表方法

public class LinkedList : IEnumerable//IEnumerable 是 .NET 的接口嘱能,用于實(shí)現(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);//對(duì)鏈表數(shù)量化
      if (First == null)//如果頭為空
      {
        First = newNode;//讓鏈表頭為新鏈表
        Last = First;//鏈表頭和鏈表尾相等
      }
      else//如果鏈表頭部位空
      {
        Last.Next = newNode;//尾鏈表的下一個(gè)元素為新鏈表
        Last = newNode;//尾鏈表尾新鏈表
      }
      return newNode;//返回鏈表
    }

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

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

然后就可以對(duì)鏈表進(jìn)行操作
完整代碼如下

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; }//指向下一個(gè)
           public LinkedListNode Prev { get; internal set; }//指向上一個(gè)
       }
       public class LinkedList : IEnumerable//IEnumerable 是 .NET 的接口员咽,用于實(shí)現(xiàn)迭代
       {
           public LinkedListNode First { get; set; }//鏈表頭
           public LinkedListNode Last { get; set; }//鏈表尾

           public LinkedListNode AddLast(object node)//創(chuàng)建鏈表
           {
               var newNode = new LinkedListNode(node);//對(duì)鏈表數(shù)量化
               if (First == null)//如果頭為空
               {
                   First = newNode;//讓鏈表頭為新鏈表
                   Last = First;//鏈表頭和鏈表尾相等
               }
               else//如果鏈表頭部位空
               {
                   Last.Next = newNode;//尾鏈表的下一個(gè)元素為新鏈表
                   Last = newNode;//尾鏈表尾新鏈表
               }
               return newNode;//返回鏈表
           }
           public IEnumerator GetEnumerator()//迭代方法獲取鏈表
           {
               LinkedListNode current = First;//獲取鏈表頭
               while (current != null)//當(dāng)前鏈表不為空
               {
                   yield return current.Value;//迭代返回鏈表的下一個(gè)元素
                   current = current.Next;//當(dāng)前元素為下一個(gè)元素
               }
           }
       }
       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);//輸出鏈表頭的下一個(gè)元素

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

           b.Prev = list1.First;//將鏈表元素b的上一個(gè)元素指向鏈表頭,
           //注意贮预,這里是必須的贝室,因?yàn)樵跒殒湵碣x值時(shí)使用的向下一個(gè)元素的指針完成的
           //但是沒(méi)有定義是一個(gè)元素是什么,指針是單向的仿吞,所以使用上一個(gè)元素指針必須指定
           WriteLine(b.Prev.Value);
           WriteLine("***************");
            foreach (var i in list1)//迭代鏈表中所有元素滑频。
           {
               WriteLine(i);
           }
           WriteLine("****************");
           LinkedListNode c = b.Next;//指定當(dāng)前鏈表的最后一個(gè)元素
           c.Next = list1.First;//使其指向鏈表頭,實(shí)現(xiàn)鏈表頭尾相連
           foreach (var i in list1)//這時(shí)會(huì)形成死循環(huán)唤冈,一直輸出峡迷,直到計(jì)算機(jī)崩潰
           {
               WriteLine(i);
           }
           ReadKey();
       }

   }
}

一些注意事項(xiàng)

  • 對(duì)鏈表迭代需要先生成枚舉器
  • 鏈表指針是單向的
  • 上述代碼中沒(méi)有實(shí)現(xiàn)返回通過(guò)指向下一個(gè)元素的指針實(shí)現(xiàn)指向上一個(gè)元素的指針,因此使用是指向上一個(gè)元素的指針需要手動(dòng)指定你虹。
  • 盡量不要對(duì)有環(huán)鏈表迭代绘搞。

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末售葡,一起剝皮案震驚了整個(gè)濱河市看杭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌挟伙,老刑警劉巖楼雹,帶你破解...
    沈念sama閱讀 216,919評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件模孩,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡贮缅,警方通過(guò)查閱死者的電腦和手機(jī)榨咐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)谴供,“玉大人块茁,你說(shuō)我怎么就攤上這事」鸺。” “怎么了数焊?”我有些...
    開(kāi)封第一講書人閱讀 163,316評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)崎场。 經(jīng)常有香客問(wèn)我佩耳,道長(zhǎng),這世上最難降的妖魔是什么谭跨? 我笑而不...
    開(kāi)封第一講書人閱讀 58,294評(píng)論 1 292
  • 正文 為了忘掉前任干厚,我火速辦了婚禮,結(jié)果婚禮上螃宙,老公的妹妹穿的比我還像新娘蛮瞄。我一直安慰自己,他們只是感情好谆扎,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布挂捅。 她就那樣靜靜地躺著,像睡著了一般燕酷。 火紅的嫁衣襯著肌膚如雪籍凝。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,245評(píng)論 1 299
  • 那天苗缩,我揣著相機(jī)與錄音饵蒂,去河邊找鬼。 笑死酱讶,一個(gè)胖子當(dāng)著我的面吹牛退盯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播泻肯,決...
    沈念sama閱讀 40,120評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼渊迁,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了灶挟?” 一聲冷哼從身側(cè)響起琉朽,我...
    開(kāi)封第一講書人閱讀 38,964評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎稚铣,沒(méi)想到半個(gè)月后箱叁,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體墅垮,經(jīng)...
    沈念sama閱讀 45,376評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評(píng)論 2 333
  • 正文 我和宋清朗相戀三年耕漱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了算色。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,764評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡螟够,死狀恐怖灾梦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情妓笙,我是刑警寧澤若河,帶...
    沈念sama閱讀 35,460評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站给郊,受9級(jí)特大地震影響牡肉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜淆九,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望毛俏。 院中可真熱鬧炭庙,春花似錦、人聲如沸煌寇。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,697評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)阀溶。三九已至腻脏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間银锻,已是汗流浹背永品。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,846評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留击纬,地道東北人鼎姐。 一個(gè)月前我還...
    沈念sama閱讀 47,819評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像更振,于是被迫代替她去往敵國(guó)和親炕桨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評(píng)論 2 354