数据结构与算法之数据结构 链表删除 单节点 / 连续节点

数据结构与算法阿木 发布于 14 天前 3 次阅读


摘要:

链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。链表删除操作是链表操作中的一项基本技能,包括删除单节点和连续节点。本文将深入探讨链表删除操作的实现原理,并通过代码示例展示如何高效地处理单节点和连续节点的删除。

一、

链表是一种非线性数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。链表删除操作是链表操作中的一项基本技能,它涉及到如何正确地修改指针,以实现节点的删除。本文将围绕链表删除操作,分别介绍单节点和连续节点的删除方法。

二、链表的基本概念

在深入讨论删除操作之前,我们需要了解链表的基本概念:

1. 节点(Node):链表的基本组成单位,包含数据和指针。

2. 链表(LinkedList):由一系列节点组成,每个节点通过指针连接。

3. 头节点(Head Node):链表的第一个节点,通常不存储数据。

4. 尾节点(Tail Node):链表的最后一个节点,其指针指向NULL。

三、单节点删除操作

单节点删除操作指的是删除链表中的一个节点,该节点只有一个前驱节点和一个后继节点。

1. 删除节点前的准备工作

在删除节点之前,我们需要找到要删除的节点及其前驱节点。

2. 删除节点

删除节点的主要步骤如下:

(1)找到要删除的节点及其前驱节点。

(2)修改前驱节点的指针,使其指向要删除节点的后继节点。

(3)释放要删除节点的内存。

下面是单节点删除操作的代码实现:

c

include <stdio.h>


include <stdlib.h>

// 定义链表节点结构体


typedef struct Node {


int data;


struct Node next;


} Node;

// 创建新节点


Node createNode(int data) {


Node newNode = (Node)malloc(sizeof(Node));


if (newNode == NULL) {


printf("内存分配失败");


exit(1);


}


newNode->data = data;


newNode->next = NULL;


return newNode;


}

// 删除单节点


void deleteNode(Node head, Node delNode) {


if (head == NULL || delNode == NULL) {


return;


}


if (head == delNode) {


head = delNode->next;


}


Node temp = head;


while (temp->next != NULL && temp->next != delNode) {


temp = temp->next;


}


if (temp->next == NULL) {


printf("要删除的节点不存在");


return;


}


temp->next = delNode->next;


free(delNode);


}

// 打印链表


void printList(Node node) {


while (node != NULL) {


printf("%d ", node->data);


node = node->next;


}


printf("");


}

// 主函数


int main() {


Node head = createNode(1);


head->next = createNode(2);


head->next->next = createNode(3);


head->next->next->next = createNode(4);

printf("原始链表:");


printList(head);

Node delNode = head->next->next; // 要删除的节点


deleteNode(&head, delNode);

printf("删除节点后的链表:");


printList(head);

return 0;


}


四、连续节点删除操作

连续节点删除操作指的是删除链表中的一系列连续节点。

1. 删除连续节点前的准备工作

在删除连续节点之前,我们需要找到要删除的连续节点的起始节点。

2. 删除连续节点

删除连续节点的主要步骤如下:

(1)找到要删除的连续节点的起始节点。

(2)遍历连续节点,修改前驱节点的指针,使其指向连续节点的最后一个节点的后继节点。

(3)释放连续节点的内存。

下面是连续节点删除操作的代码实现:

c

// 删除连续节点


void deleteConsecutiveNodes(Node head, Node delNode) {


if (head == NULL || delNode == NULL) {


return;


}


if (head == delNode) {


head = delNode->next;


}


Node temp = head;


while (temp->next != NULL && temp->next != delNode) {


temp = temp->next;


}


if (temp->next == NULL) {


printf("要删除的连续节点不存在");


return;


}


while (temp->next != delNode) {


Node toDelete = temp->next;


temp->next = toDelete->next;


free(toDelete);


}


}

// 主函数


int main() {


Node head = createNode(1);


head->next = createNode(2);


head->next->next = createNode(3);


head->next->next->next = createNode(4);


head->next->next->next->next = createNode(5);

printf("原始链表:");


printList(head);

Node delNode = head->next->next; // 要删除的连续节点起始节点


deleteConsecutiveNodes(&head, delNode);

printf("删除连续节点后的链表:");


printList(head);

return 0;


}


五、总结

本文深入探讨了链表删除操作,包括单节点和连续节点的删除方法。通过代码示例,我们了解了如何正确地修改指针,以实现节点的删除。在实际应用中,链表删除操作是链表操作中的一项基本技能,熟练掌握删除操作对于链表编程具有重要意义。