在单链表中,每个节点只包含一个指向下一个节点的指针。单链表的插入和删除操作相对简单,但需要注意指针的正确调整。以下是单链表中插入和删除节点的基本方法:
### 插入节点
**在给定节点后插入新节点**
假设我们要在节点 `p` 后面插入一个新节点 `s`。
**步骤:**
1. **创建新节点 `s`:**
- 为新节点分配内存。
- 设置新节点的数据部分。
2. **调整指针:**
- 将 `s` 的 `next` 指针指向 `p` 的 `next`。
- 将 `p` 的 `next` 指针指向 `s`。
**代码示例:**
```c
#include <stdio.h>
#include <stdlib.h>
// 定义节点结构
typedef struct Node {
int data;
struct Node* next;
} Node;
// 在节点 p 后插入新节点 s
void insertAfter(Node* p, int data) {
if (p == NULL) return;
Node* s = (Node*)malloc(sizeof(Node));
s->data = data;
s->next = p->next;
p->next = s;
}
```
**在链表头部插入新节点**
如果需要在链表头部插入节点,需要更新头指针。
**步骤:**
1. **创建新节点 `s`:**
- 为新节点分配内存。
- 设置新节点的数据部分。
2. **调整指针:**
- 将 `s` 的 `next` 指针指向当前的头节点。
- 更新头指针指向 `s`。
**代码示例:**
```c
// 在链表头部插入新节点
void insertAtHead(Node** head, int data) {
Node* s = (Node*)malloc(sizeof(Node));
s->data = data;
s->next = *head;
*head = s;
}
```
### 删除节点
**删除给定节点后的节点**
假设我们要删除节点 `p` 后的节点。
**步骤:**
1. **检查 `p` 的 `next` 是否为空:**
- 如果 `p->next` 为空,则没有节点可删除。
2. **调整指针和释放内存:**
- 将临时指针 `temp` 指向 `p->next`。
- 将 `p` 的 `next` 指针指向 `temp->next`。
- 释放 `temp` 的内存。
**代码示例:**
```c
// 删除节点 p 后的节点
void deleteAfter(Node* p) {
if (p == NULL || p->next == NULL) return;
Node* temp = p->next;
p->next = temp->next;
free(temp);
}
```
**删除链表头部节点**
如果需要删除链表的头节点,需要更新头指针。
**步骤:**
1. **检查链表是否为空:**
- 如果头指针为空,则链表为空,无需删除。
2. **调整头指针和释放内存:**
- 将临时指针 `temp` 指向当前的头节点。
- 更新头指针指向 `temp->next`。
- 释放 `temp` 的内存。
**代码示例:**
```c
// 删除链表头部节点
void deleteHead(Node** head) {
if (*head == NULL) return;
Node* temp = *head;
*head = (*head)->next;
free(temp);
}
```
### 注意事项
- **边界条件**:在进行插入和删除操作时,特别要注意空链表和单节点链表的情况。
- **内存管理**:确保在删除节点时正确释放节点的内存,以避免内存泄漏。
- **检查空指针**:在操作之前检查指针是否为空,以避免空指针异常。
以上是单链表中插入和删除操作的基本实现。如果有更多问题或需要进一步帮助,请随时告诉我!