C#数据结构与算法系列(六):链表——双链表(Double-LinkedList)
1.对比单向链表
单向链表查找的方向只能是一个方向,而双向链表可以向前或者向后查找
单向链表不能自我删除,需要靠辅助节点,而双向链表可以自我删除
对于单向链表的删除,我们首先要找到单向链表待删除节点的前一个节点,然后前一个节点的下一个节点指向删除节点的后一个节点。
2.双向链表的思路
3.代码实现
public class ListNode { public ListNode(int id, string name, string nickName) { this.Id = id; this.Name = name; this.NickName = nickName; } public int Id { get; set; } public string Name { get; set; } public string NickName { get; set; } public ListNode Next { get; set; } public ListNode Pre { get; set; } }
public class DoubleLinkedList { public ListNode HeadNode; public DoubleLinkedList() { HeadNode = new ListNode(0, "", ""); } public void GetList() { var temp = HeadNode.Next; while (temp != null) { Console.WriteLine($"id={temp.Id},name={temp.Name},nickName={temp.NickName}"); temp = temp.Next; } } public void Add(ListNode listNode) { var temp = HeadNode; //如果temp.Next为null就表示temp为最后一个节点; while (temp.Next != null) { temp = temp.Next; } //把最后的节点指向待添加的节点 temp.Next = listNode; //将待添加的前一个节点指向temp listNode.Pre = temp; } public void Update(ListNode listNode) { var temp = HeadNode; //bool flag = false; while (temp.Next != null) { if (temp.Next.Id == listNode.Id) { //flag = true; temp.Next.Name = listNode.Name; temp.Next.NickName = listNode.NickName; break; } temp = temp.Next; } //if (flag) //{ // temp.Next.Name = listNode.Name; // temp.Next.NickName = listNode.NickName; //} //else Console.WriteLine("未找到"); } public void Delete(int id) { /*{ var temp = HeadNode; while (temp.Next != null) { if (temp.Next.Id == id) { if (temp.Next.Next != null) temp.Next.Next.Pre = temp; temp.Next.Pre.Next = temp.Next.Next; } temp = temp.Next; } }*/ var temp = HeadNode.Next; while (temp != null) { if (temp.Id == id) { //如果是最后一个节点,那么就不需要执行下面的temp.Next.Pre = temp.Pre; if (temp.Next != null) temp.Next.Pre = temp.Pre;//将temp的后一个节点的前一个指针指向temp的前一个节点 temp.Pre.Next = temp.Next;//将temp的前一个节点的后一个指针指向temp的后一个节点 } temp = temp.Next; } } public static void Test() { Console.WriteLine("双向链表的测试\n"); ListNode listNode1 = new ListNode(1, "宋江", "及时雨"); ListNode listNode2 = new ListNode(2, "卢俊义", "玉麒麟"); ListNode listNode3 = new ListNode(3, "吴用", "智多星"); ListNode listNode4 = new ListNode(4, "林冲", "豹子头"); DoubleLinkedList linkedList = new DoubleLinkedList(); //添加链表数据 linkedList.Add(listNode1); linkedList.Add(listNode2); linkedList.Add(listNode3); linkedList.Add(listNode4); //获取链表所有数据 linkedList.GetList(); linkedList.Update(new ListNode(1, "宋", "及时")); Console.WriteLine("\n获取链表修改后的所有数据\n"); linkedList.GetList(); linkedList.Delete(1); Console.WriteLine("\n获取链表删除后的所有数据\n"); linkedList.GetList(); } }
微信:17873041739
分类:
DataStructure
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?