日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#实现双向链表

發(fā)布時間:2025/3/15 C# 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#实现双向链表 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

原文:http://www.cnblogs.com/skywang12345/p/3561803.html#a33 沒有C#版本的。。是不是很方。。不過圖和說明很好,引用一下

雙向鏈表

雙向鏈表(雙鏈表)是鏈表的一種。和單鏈表一樣,雙鏈表也是由節(jié)點組成,它的每個數(shù)據(jù)結(jié)點中都有兩個指針,分別指向直接后繼和直接前驅(qū)。所以,從雙向鏈表中的任意一個結(jié)點開始,都可以很方便地訪問它的前驅(qū)結(jié)點和后繼結(jié)點。一般我們都構(gòu)造雙向循環(huán)鏈表。

雙鏈表的示意圖如下:

表頭為空,表頭的后繼節(jié)點為"節(jié)點10"(數(shù)據(jù)為10的節(jié)點);"節(jié)點10"的后繼節(jié)點是"節(jié)點20"(數(shù)據(jù)為10的節(jié)點),"節(jié)點20"的前繼節(jié)點是"節(jié)點10";"節(jié)點20"的后繼節(jié)點是"節(jié)點30","節(jié)點30"的前繼節(jié)點是"節(jié)點20";...;末尾節(jié)點的后繼節(jié)點是表頭。

雙鏈表刪除節(jié)點

刪除"節(jié)點30"
刪除之前:"節(jié)點20"的后繼節(jié)點為"節(jié)點30","節(jié)點30" 的前繼節(jié)點為"節(jié)點20"。"節(jié)點30"的后繼節(jié)點為"節(jié)點40","節(jié)點40" 的前繼節(jié)點為"節(jié)點30"。
刪除之后:"節(jié)點20"的后繼節(jié)點為"節(jié)點40","節(jié)點40" 的前繼節(jié)點為"節(jié)點20"。

?雙鏈表添加節(jié)點

?

在"節(jié)點10"與"節(jié)點20"之間添加"節(jié)點15"
添加之前:"節(jié)點10"的后繼節(jié)點為"節(jié)點20","節(jié)點20" 的前繼節(jié)點為"節(jié)點10"。
添加之后:"節(jié)點10"的后繼節(jié)點為"節(jié)點15","節(jié)點15" 的前繼節(jié)點為"節(jié)點10"。"節(jié)點15"的后繼節(jié)點為"節(jié)點20","節(jié)點20" 的前繼節(jié)點為"節(jié)點15"。

代碼

/// <summary>/// 雙向鏈表節(jié)點/// </summary>/// <typeparam name="T"></typeparam>public class BdNode<T>{public T Data { set; get; }public BdNode<T> Next { set; get; } public BdNode<T> Prev { set; get; } public BdNode(T val, BdNode<T> prev, BdNode<T> next){this.Data = val;this.Prev = prev;this.Next = next;}}

鏈表操作:

public class DoubleLink<T>{//表頭private readonly BdNode<T> _linkHead;//節(jié)點個數(shù)private int _size;public DoubleLink(){_linkHead = new BdNode<T>(default(T), null, null);//雙向鏈表 表頭為空_linkHead.Prev = _linkHead;_linkHead.Next = _linkHead;_size = 0;}public int GetSize() => _size;public bool IsEmpty() => (_size == 0);//通過索引查找private BdNode<T> GetNode(int index){if (index < 0 || index >= _size)throw new IndexOutOfRangeException("索引溢出或者鏈表為空");if (index < _size / 2)//正向查找 {BdNode<T> node = _linkHead.Next;for (int i = 0; i < index; i++)node = node.Next;return node;}//反向查找BdNode<T> rnode = _linkHead.Prev;int rindex = _size - index - 1;for (int i = 0; i < rindex; i++)rnode = rnode.Prev;return rnode;}public T Get(int index) => GetNode(index).Data;public T GetFirst() => GetNode(0).Data;public T GetLast() => GetNode(_size - 1).Data;// 將節(jié)點插入到第index位置之前public void Insert(int index, T t){if (_size < 1 || index >= _size)throw new Exception("沒有可插入的點或者索引溢出了");if (index == 0)Append(_size, t);else{BdNode<T> inode = GetNode(index);BdNode<T> tnode = new BdNode<T>(t, inode.Prev, inode);inode.Prev.Next = tnode;inode.Prev = tnode;_size++;}}//追加到index位置之后public void Append(int index, T t){BdNode<T> inode;if (index == 0)inode = _linkHead;else{index = index - 1;if (index < 0)throw new IndexOutOfRangeException("位置不存在");inode = GetNode(index);}BdNode<T> tnode = new BdNode<T>(t, inode, inode.Next);inode.Next.Prev = tnode;inode.Next = tnode;_size++;}public void Del(int index){BdNode<T> inode = GetNode(index);inode.Prev.Next = inode.Next;inode.Next.Prev = inode.Prev;_size--;}public void DelFirst() => Del(0);public void DelLast() => Del(_size - 1); public void ShowAll(){Console.WriteLine("******************* 鏈表數(shù)據(jù)如下 *******************");for (int i = 0; i < _size; i++)Console.WriteLine("(" + i + ")=" + Get(i));Console.WriteLine("******************* 鏈表數(shù)據(jù)展示完畢 *******************\n");}}

測試:

DoubleLink<int> dlink = new DoubleLink<int>();// 創(chuàng)建雙向鏈表Console.WriteLine("將 20 插入到表頭之后");dlink.Append(0, 10); dlink.ShowAll();Console.WriteLine("將 40 插入到表頭之后");dlink.Append(1, 30); dlink.ShowAll();Console.WriteLine("將 10 插入到表頭之前");dlink.Insert(0, 40); dlink.ShowAll();Console.WriteLine("將 30 插入到第一個位置之前");dlink.Insert(1, 20); dlink.ShowAll();Console.WriteLine("展示第一個:" + dlink.GetFirst()); Console.WriteLine("刪除第一個");dlink.DelFirst();Console.WriteLine("展示第一個:" + dlink.GetFirst());Console.WriteLine("展示最后一個:" + dlink.GetLast());Console.WriteLine("刪除最后一個");dlink.DelLast();Console.WriteLine("展示最后一個:" + dlink.GetLast());dlink.ShowAll();Console.ReadKey();

?

轉(zhuǎn)載于:https://www.cnblogs.com/ylsforever/p/6510528.html

與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的C#实现双向链表的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。