目录
一、涉及到的知识点
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
*/