鏈表是一種常見的數(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; }