目录

一、涉及到的知识点

1.定义

2.双向链表与单向链表的区别

二、实例


一、涉及到的知识点

1.定义

        在双向链表中,每个节点有两个指针域,一个指向它的前一个节点(即直接前驱),另一个指向它的后一个节点(即直接后继)。这种设计使得双向链表可以进行双向遍历,即可以从头节点开始向前遍历,也可以从尾节点开始向后遍历。

        双向链表的节点结构通常如下所示:

struct Node
{
    // 数据域
    int data;
    // 指向直接前驱的指针
    Node* prev;
    // 指向直接后继的指针
    Node* next;
};

2.双向链表与单向链表的区别

        双向链表的算法描述和单向链表基本相同,但是双向链表在删除和插入节点时与单向链表有很大的不同:双向链表在删除节点时,不但要修改节点的直接后继指针,还要同时修改节点的直接前驱指针。在插入时更是要修改插入节点的前驱和后继的两个方向上的指针。

二、实例

        在实例的双向链表类中,设计一个Append方法向链表的末尾追加初始数据5,2,8,1。然后用Print方法显示链表数据。

// 双向链表实现:Append方法、Print方法

namespace _132_1
{
    public class Objects(int num, string name, int count)
    {
        public int Num { get; set; } = num;
        public string Name { get; set; } = name;
        public int Count { get; set; } = count;
    }

    public class ListNode(Objects obj)
    {
        public Objects Object { get; set; } = obj;
        public ListNode? Next { get; set; } = null;
    }

    public class LinkedList
    {
        private ListNode? _head;
        private ListNode? _tail;

        public void Append(Objects obj)
        {
            ListNode newNode = new(obj);

            if (_head == null)
            {
                _head = newNode;
                _tail = newNode;
            }
            else
            {
                _tail!.Next = newNode;
                _tail = newNode;
            }
        }

        public void Print()
        {
            ListNode? current = _head;

            while (current != null)
            {
                Console.WriteLine(current.Object.Num);
                current = current.Next;
            }
        }
    }

    public class Program
    {
        static void Main(string[] args)
        {
            ArgumentNullException.ThrowIfNull(args);

            LinkedList linkedList = new();

            linkedList.Append(new Objects(5, "Five", 1));
            linkedList.Append(new Objects(2, "Two", 2));
            linkedList.Append(new Objects(8, "Eight", 3));
            linkedList.Append(new Objects(1, "One", 4));

            linkedList.Print();
        }
    }
}
//运行结果:
/*
5
2
8
1

 */
03-03 10:49