C#数据结构与算法(六):链表——双链表(Double-LinkedList)
2021-05-12 11:28
标签:查找 loading double 辅助 class 代码 alt public 节点 单向链表查找的方向只能是一个方向,而双向链表可以向前或者向后查找 单向链表不能自我删除,需要靠辅助节点,而双向链表可以自我删除 对于单向链表的删除,我们首先要找到单向链表待删除节点的前一个节点,然后前一个节点的下一个节点指向删除节点的后一个节点。
C#数据结构与算法(六):链表——双链表(Double-LinkedList) 标签:查找 loading double 辅助 class 代码 alt public 节点 原文地址:https://www.cnblogs.com/vic-tory/p/13140779.html1.对比单向链表
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();
}
}
上一篇:实验九:python包管理
下一篇:操作数组的10个方法
文章标题:C#数据结构与算法(六):链表——双链表(Double-LinkedList)
文章链接:http://soscw.com/essay/84662.html