删除链表(删除链表倒数第n个元素)

## 删除链表### 简介链表是一种常见的数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。删除链表操作指的是从链表中移除一个或多个节点。### 删除链表的类型根据删除目标的不同,删除链表操作可以分为以下几种类型:

删除指定值的节点:

从链表中删除所有数据域等于特定值的节点。

删除指定位置的节点:

从链表中删除指定位置的节点,例如删除头节点、尾节点或第 k 个节点。

删除整个链表:

释放链表所有节点占用的内存空间。### 删除链表的方法#### 1. 删除指定值的节点删除指定值的节点通常需要遍历链表,找到目标节点并将其从链表中移除。

步骤:

1.

遍历链表:

从头节点开始,依次访问每个节点。 2.

查找目标节点:

对于每个节点,检查其数据域是否等于目标值。 3.

删除目标节点:

如果找到目标节点,则将其前一个节点的指针指向目标节点的下一个节点,并将目标节点的 `next` 指针设置为 `NULL`。

如果目标节点是头节点,则将头指针指向下一个节点。 4.

释放内存:

使用 `free()` 函数释放目标节点占用的内存空间。

代码示例 (C语言):

```c struct Node {int data;struct Node

next; };void deleteNode(struct Node

headRef, int key) {struct Node

temp =

headRef,

prev;// 如果头节点包含要删除的 keyif (temp != NULL && temp->data == key) {

headRef = temp->next; // 更改头指针free(temp); // 释放旧的头节点return;}// 遍历链表while (temp != NULL && temp->data != key) {prev = temp;temp = temp->next;}// 如果 key 不存在于链表中if (temp == NULL)return;// 从链表中取消链接节点prev->next = temp->next;free(temp); // 释放已删除节点 } ```#### 2. 删除指定位置的节点删除指定位置的节点需要先找到目标节点,然后将其从链表中移除。

步骤:

1.

找到目标节点:

如果要删除头节点,则直接将头指针指向下一个节点即可。

如果要删除其他位置的节点,则需要先遍历链表,找到目标节点的前一个节点。 2.

删除目标节点:

将目标节点前一个节点的 `next` 指针指向目标节点的下一个节点。

如果目标节点是尾节点,则将尾指针设置为 `NULL`。 3.

释放内存:

使用 `free()` 函数释放目标节点占用的内存空间。

代码示例 (C语言):

```c // 删除给定链表中指定位置的节点。 // position 是从 1 开始的,即 1 表示链表的第一个节点。 void deleteNodeAtPosition(struct Node

headRef, int position) {// 如果链表为空if (

headRef == NULL)return;// 存储头节点struct Node

temp =

headRef;// 如果要删除头节点if (position == 1) {

headRef = temp->next; // 更改头指针free(temp); // 释放旧的头节点return;}// 找到要删除节点的前一个节点// 我们需要遍历 position-1 个节点for (int i = 1; temp != NULL && i < position - 1; i++)temp = temp->next;// 如果 position 超过链表长度if (temp == NULL || temp->next == NULL)return;// temp->next 是要删除的节点。// 将下一个节点存储在 Node

next 中struct Node

next = temp->next->next;// 取消链接要删除的节点free(temp->next); // 释放要删除的节点temp->next = next; // 取消链接后重新链接 } ```#### 3. 删除整个链表删除整个链表需要遍历链表,并释放每个节点占用的内存空间。

步骤:

1.

遍历链表:

从头节点开始,依次访问每个节点。 2.

释放节点内存:

对于每个节点,使用 `free()` 函数释放其占用的内存空间。 3.

更新头指针:

将头指针设置为 `NULL`。

代码示例 (C语言):

```c void deleteList(struct Node

headRef) {struct Node

current =

headRef;struct Node

next;while (current != NULL) {next = current->next;free(current);current = next;}

headRef = NULL; } ```### 总结删除链表是链表操作中的基本操作之一。根据删除目标的不同,可以选择不同的方法来删除链表。在实际应用中,需要根据具体的需求选择合适的删除方法。

删除链表

简介链表是一种常见的数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。删除链表操作指的是从链表中移除一个或多个节点。

删除链表的类型根据删除目标的不同,删除链表操作可以分为以下几种类型:* **删除指定值的节点:** 从链表中删除所有数据域等于特定值的节点。 * **删除指定位置的节点:** 从链表中删除指定位置的节点,例如删除头节点、尾节点或第 k 个节点。 * **删除整个链表:** 释放链表所有节点占用的内存空间。

删除链表的方法

1. 删除指定值的节点删除指定值的节点通常需要遍历链表,找到目标节点并将其从链表中移除。**步骤:**1. **遍历链表:** 从头节点开始,依次访问每个节点。 2. **查找目标节点:** 对于每个节点,检查其数据域是否等于目标值。 3. **删除目标节点:*** 如果找到目标节点,则将其前一个节点的指针指向目标节点的下一个节点,并将目标节点的 `next` 指针设置为 `NULL`。* 如果目标节点是头节点,则将头指针指向下一个节点。 4. **释放内存:** 使用 `free()` 函数释放目标节点占用的内存空间。**代码示例 (C语言):**```c struct Node {int data;struct Node* next; };void deleteNode(struct Node** headRef, int key) {struct Node* temp = *headRef, *prev;// 如果头节点包含要删除的 keyif (temp != NULL && temp->data == key) {*headRef = temp->next; // 更改头指针free(temp); // 释放旧的头节点return;}// 遍历链表while (temp != NULL && temp->data != key) {prev = temp;temp = temp->next;}// 如果 key 不存在于链表中if (temp == NULL)return;// 从链表中取消链接节点prev->next = temp->next;free(temp); // 释放已删除节点 } ```

2. 删除指定位置的节点删除指定位置的节点需要先找到目标节点,然后将其从链表中移除。**步骤:**1. **找到目标节点:*** 如果要删除头节点,则直接将头指针指向下一个节点即可。* 如果要删除其他位置的节点,则需要先遍历链表,找到目标节点的前一个节点。 2. **删除目标节点:*** 将目标节点前一个节点的 `next` 指针指向目标节点的下一个节点。* 如果目标节点是尾节点,则将尾指针设置为 `NULL`。 3. **释放内存:** 使用 `free()` 函数释放目标节点占用的内存空间。**代码示例 (C语言):**```c // 删除给定链表中指定位置的节点。 // position 是从 1 开始的,即 1 表示链表的第一个节点。 void deleteNodeAtPosition(struct Node** headRef, int position) {// 如果链表为空if (*headRef == NULL)return;// 存储头节点struct Node* temp = *headRef;// 如果要删除头节点if (position == 1) {*headRef = temp->next; // 更改头指针free(temp); // 释放旧的头节点return;}// 找到要删除节点的前一个节点// 我们需要遍历 position-1 个节点for (int i = 1; temp != NULL && i < position - 1; i++)temp = temp->next;// 如果 position 超过链表长度if (temp == NULL || temp->next == NULL)return;// temp->next 是要删除的节点。// 将下一个节点存储在 Node *next 中struct Node* next = temp->next->next;// 取消链接要删除的节点free(temp->next); // 释放要删除的节点temp->next = next; // 取消链接后重新链接 } ```

3. 删除整个链表删除整个链表需要遍历链表,并释放每个节点占用的内存空间。**步骤:**1. **遍历链表:** 从头节点开始,依次访问每个节点。 2. **释放节点内存:** 对于每个节点,使用 `free()` 函数释放其占用的内存空间。 3. **更新头指针:** 将头指针设置为 `NULL`。**代码示例 (C语言):**```c void deleteList(struct Node** headRef) {struct Node* current = *headRef;struct Node* next;while (current != NULL) {next = current->next;free(current);current = next;}*headRef = NULL; } ```

总结删除链表是链表操作中的基本操作之一。根据删除目标的不同,可以选择不同的方法来删除链表。在实际应用中,需要根据具体的需求选择合适的删除方法。

标签列表