C#数据结构与算法系列(六):链表——双链表(Double-LinkedList)

1.对比单向链表

单向链表查找的方向只能是一个方向,而双向链表可以向前或者向后查找

单向链表不能自我删除,需要靠辅助节点,而双向链表可以自我删除

对于单向链表的删除,我们首先要找到单向链表待删除节点的前一个节点,然后前一个节点的下一个节点指向删除节点的后一个节点。

2.双向链表的思路

C#数据结构与算法系列(六):链表——双链表(Double-LinkedList)_第1张图片

 

 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();
        }
    }

C#数据结构与算法系列(六):链表——双链表(Double-LinkedList)_第2张图片

 

你可能感兴趣的:(C#数据结构与算法系列(六):链表——双链表(Double-LinkedList))