由头指针的链表和无头指针链表的区别,链表插入删除的基本代码
时间: 2024-09-07 07:04:07 浏览: 40
链表按照是否有头结点,通常分为两类:带头指针的链表和无头指针链表。
**带头指针的链表(单链表)**:
- 每个节点除了包含数据域外,还额外有一个指针域,称为“next”,指向链表中的下一个节点,链表的第一个节点被称为头结点。
- 插入操作通常会从头开始,如果需要在链表中间插入,需要找到目标位置并更新新旧节点的next指针。
- 删除操作也需要定位到待删节点,并调整前一节点的next指针指向新的节点或删除头节点。
**无头指针链表**:
- 节点内部不再包含指向其他节点的直接引用,而是所有节点都只保存与其相邻节点的链接信息。
- 插入操作可能会稍微复杂一些,因为没有明确的起点,需要从第一个节点开始遍历直到找到插入位置。
- 删除操作同样需要遍历找到节点,但操作相对简单,只需更改前一个节点指向当前节点的邻居即可。
以下是单链表的插入和删除基本代码示例(假设使用C++语言):
```cpp
// 插入节点到链表头部
void insertAtHead(int value) {
Node* newNode = new Node(value);
if (head == nullptr) { // 如果链表为空
head = newNode;
} else {
newNode->next = head; // 新节点的next指向原头节点
head = newNode; // 更新头节点
}
}
// 删除指定值的节点
void deleteNodeWithValue(int value) {
if (head == nullptr) return; // 链表空的情况
if (head->data == value) { // 如果头节点就是要删除的
Node* temp = head;
head = head->next; // 移除头节点
delete temp; // 释放内存
return;
}
Node* current = head;
while (current->next != nullptr && current->next->data != value) {
current = current->next; // 寻找目标节点
}
if (current->next != nullptr) { // 找到了目标节点
Node* temp = current->next;
current->next = current->next->next; // 删除目标节点
delete temp; // 释放内存
}
}
```
这里`Node`是一个自定义的链表节点类,包含`data`和`next`两个成员变量。上述代码假设链表的头结点`head`已初始化。
阅读全文