带头结点的单链表是一种常见的数据结构,其中头结点本身不存储数据,只用于指向链表的第一个实际节点。头插法和尾插法是两种常见的插入节点的方法。
头插法(Head Insertion)
头插法是指每次插入新节点时,新节点都成为链表的第一个实际节点。具体步骤如下:
-
创建一个新节点。
-
将新节点的
next
指针指向当前链表的第一个实际节点。 -
将头结点的
next
指针指向新节点。
// 头插法创建链表
void CreateList_HeadInsert(LinkList &L, int n) {
L = new Lnode; // 创建头结点
L->next = nullptr; // 头结点的next指针初始化为nullptr
for (int i = 0; i < n; i++) {
LinkList p = new Lnode; // 创建新节点
cout << "请输入数据域: ";
cin >> p->data; // 输入新节点的数据域
p->next = L->next; // 新节点的next指向当前头结点的next
L->next = p; // 头结点的next指向新节点
}
}
尾插法(Tail Insertion)
尾插法是指每次插入新节点时,新节点都成为链表的最后一个实际节点。具体步骤如下:
-
创建一个新节点。
-
将当前链表的最后一个节点的
next
指针指向新节点。 -
更新尾指针,使其指向新节点。
// 尾插法创建链表
void CreateList_TailInsert(LinkList &L, int n) {
L = new Lnode; // 创建头结点
L->next = nullptr; // 头结点的next指针初始化为nullptr
LinkList r = L; // 尾指针r指向头结点
for (int i = 0; i < n; i++) {
LinkList p = new Lnode; // 创建新节点
cout << "请输入数据域: ";
cin >> p->data; // 输入新节点的数据域
p->next = nullptr; // 新节点的next指针初始化为nullptr
r->next = p; // 尾指针的next指向新节点
r = p; // 尾指针r指向新节点
}
}