鏈表是一種常見(jiàn)的數(shù)據(jù)結(jié)構(gòu),通常由兩部分組成狭瞎,
存儲(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; }