• 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("双向链表的测试
    ");
    
                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("
    获取链表修改后的所有数据
    ");
                linkedList.GetList();
    
    
                linkedList.Delete(1);
    
                Console.WriteLine("
    获取链表删除后的所有数据
    ");
                linkedList.GetList();
            }
        }

  • 相关阅读:
    个人总结
    再见,我的伪算法竞赛生涯。
    C语言实现迷宫小游戏
    关于第九届蓝桥杯决赛
    蓝桥杯近3年决赛题之3(17年b组)
    蓝桥杯近3年决赛题之二(16年b组)
    蓝桥杯近三年决赛题之一(15年B组)
    第九届蓝桥杯C/C++B组省赛感想
    读书笔记《程序员的自我修养—链接、装载与库》
    蓝桥杯近3年初赛题之三(17年b组)
  • 原文地址:https://www.cnblogs.com/vic-tory/p/13140779.html
Copyright © 2020-2023  润新知