首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

删除单链表中的节点

基础概念

单链表(Singly Linked List)是一种线性数据结构,其中每个元素称为节点(Node),每个节点包含两部分:数据域和指针域。数据域存储数据,指针域存储下一个节点的地址。链表的头节点(Head Node)指向第一个节点,最后一个节点的指针域指向空(NULL)。

删除节点的优势

  1. 动态内存管理:链表可以动态地分配和释放内存,适合不确定大小的数据集合。
  2. 插入和删除操作高效:在已知节点的情况下,插入和删除操作的时间复杂度为O(1)。
  3. 空间利用率高:链表不需要连续的内存空间,适合内存碎片化的环境。

类型

单链表有多种变体,包括:

  1. 单向链表(Singly Linked List):每个节点只有一个指向下一个节点的指针。
  2. 双向链表(Doubly Linked List):每个节点有两个指针,一个指向前一个节点,一个指向后一个节点。
  3. 循环链表(Circular Linked List):链表的最后一个节点指向头节点,形成一个环。

应用场景

  1. 动态数据存储:如缓存、队列、栈等。
  2. 内存管理:如垃圾回收机制。
  3. 图和树的遍历:如深度优先搜索(DFS)。

删除节点的操作

删除单链表中的节点通常涉及以下步骤:

  1. 找到要删除的节点:从头节点开始遍历,直到找到目标节点。
  2. 修改指针:将目标节点的前一个节点的指针指向目标节点的下一个节点。

示例代码

以下是一个删除单链表中节点的示例代码(假设节点结构如下):

代码语言:txt
复制
struct Node {
    int data;
    struct Node* next;
};

删除节点的函数如下:

代码语言:txt
复制
void deleteNode(struct Node** head_ref, int key) {
    // 如果头节点就是要删除的节点
    if (*head_ref != NULL && (*head_ref)->data == key) {
        struct Node* temp = *head_ref;
        *head_ref = (*head_ref)->next;
        free(temp);
        return;
    }

    // 查找要删除的节点
    struct Node* current = *head_ref;
    struct Node* previous = NULL;
    while (current != NULL && current->data != key) {
        previous = current;
        current = current->next;
    }

    // 如果节点不存在
    if (current == NULL) {
        return;
    }

    // 删除节点
    previous->next = current->next;
    free(current);
}

可能遇到的问题及解决方法

  1. 内存泄漏:删除节点后未释放内存。解决方法是在删除节点时调用free函数释放内存。
  2. 指针错误:修改指针时出现错误,导致链表断裂或形成环。解决方法是仔细检查指针修改的逻辑。
  3. 空指针引用:在链表为空或节点不存在时进行删除操作。解决方法是在操作前检查链表和节点的状态。

参考链接

通过以上内容,你应该对单链表删除节点的操作有了全面的了解。如果有更多具体问题,欢迎继续提问。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

链表问题】删除链表中间节点

【题目描述】 给定链表节点head,实现删除链表中间节点函数。   ...例如:   步删除任何节点;   1->2,删除节点1;   1->2->3,删除节点2;   1->2->3->4,删除节点2;   1->2->3->4-5,删除节点3; 【要求】 如果链表长度为...不过在做时候,最好是先把一些特殊情况先处理好,例如删除可能是第一个节点,也有可能不用删除节点(只有一个节点时就不用删除了。...slow.next = slow.next.next; return head; } 上次那道删除倒数第 K 个节点题(【链表问题】删除链表第K个节点) 其实也是可以使用双指针...问题拓展 题目:删除链表 a / b 处节点 【题目描述】   给定链表节点 head、整数 a 和 b,实现删除位于 a/b 处节点函数。

85740
  • 链表问题】删除链表第K个节点

    前言 以专题形式更新刷题贴,欢迎跟我一起学习刷题。每道题会提供简单解答。 【题目描述】 在链表删除倒数第 K 个节点。...【要求】 如果链表长度为 N, 时间复杂度达到 O(N), 额外空间复杂度达到 O(1) 【难度】 士 【解答】 删除时候会出现三种情况: 1、不存在倒数第 K 个节点,此时不用删除。...2、倒数第 K 个节点就是第一个节点。 3、倒数第 K 个节点在第一个节点之后。 所以我们可以用一个变量 num 记录链表一共有多少个节点。 如果 num < K,则属于第一种情况。...如果 num == K,则属于第二情况。 如果 num > K, 则属于第三种情况,此时删除倒数第 K 个节点等价于删除第 (num - k + 1) 个节点。...(num-k+1)个节点 //定位到这个点前驱 while (num - K !

    1.7K10

    删除链表节点

    题目描述 难度级别:简单 请编写一个函数,使其可以删除某个链表给定(非末尾)节点。传入函数唯一参数为 要被删除节点 。...示例 2: 输入:head = [4,5,1,9], node = 1 输出:[4,5,9] 解释:给定你链表中值为 1 第三个节点,那么在调用了你函数之后,该链表应变为 4 -> 5 -> 9....提示: 链表至少包含两个节点链表中所有节点值都是唯一。 给定节点为非末尾节点并且一定是链表一个有效节点。 不要从你函数返回任何结果。...解题思路 题目中待传递给当前函数实参node,它是链表某一个待删除节点,然后从链表删除这个节点。...这里因为待传入实参没有完整链表,所以无法获取到之前节点,所以无法修改前一个节点next指向。这时需要是将要删除节点值替换为它下一个节点值,之后要删除这个节点next指向为下下一项。

    2.4K00

    237 删除链表节点

    01 题目信息 题目地址: https://leetcode-cn.com/problems/delete-node-in-a-linked-list/ 请编写一个函数,使其可以删除某个链表给定(非末尾...传入函数唯一参数为 要被删除节点 。 现有一个链表 -- head = [4,5,1,9],它可以表示为: ?...提示: 链表至少包含两个节点链表中所有节点值都是唯一。 给定节点为非末尾节点并且一定是链表一个有效节点。 不要从你函数返回任何结果。...x) { val = x; } } 现在它传一条链表一个节点删除这个节点。...这样就不用改变4节点指向,只是把它指向这个对象值与next都改掉,那么4还是指向0x001只不过是1了,而这个指向又是0x004就是9,链表也就变成了4--->1--->9完成删除5操作 public

    1.3K10

    删除链表重复节点.

    前言 在一个排序链表,存在重复节点,如何删除链表重复节点并返回删除链表头指针?例如:1->2->3->3->4->4->5,处理后为: 1->2->5。...本文将分享这个问题解决思路与实现代码,欢迎各位感兴趣开发者阅读本文。 常规思路 根据题意,我们可以知道链表元素是排好序。如果节点重复的话,当前节点一定与下一个节点相同。...其次,我们需要创建两个指针: 一个指向当前不重复节点,我们将它命名为pre 一个为搜索指针,用于搜索链表与当前节点不重复节点,我们将它命名为last 随后,我们为 pre 与 last 进行初始赋值...20220226224625702 实现代码 接下来,我们将上述思路转换为代码,如下所示: /** * 删除链表重复节点 * @param pHead 链表节点 */ deleteDuplicatesNode...* * 删除链表重复节点(递归解法) * @param pHead 链表节点 */ deleteDuplicatesNodeForRecursion(pHead: ListNode

    2.8K40

    2 删除链表节点

    复习链表插入 链表一个节点是由数据域和指针域构成,指针域地址值为下个元素地址。那么我们需要插入或者删除一个元素怎么处理呢? ? 先查看原始链表结构,准备将结点x插入链表。 ?...复习链表删除 上面简单介绍了带头结点链表,在删除处理时候同样适用,所以我们以后就直接采用带头结点链表讲解。下面直接看看删除节点图。 ?...1 Leetcode237 删除链表节点 请编写一个函数,使其可以删除某个链表给定(非末尾)节点,你将只被给定要求被删除节点。...说明: 链表至少包含两个节点链表中所有节点值都是唯一。 给定节点为非末尾节点并且一定是链表一个有效节点。 不要从你函数返回任何结果。 先思考一分钟哟! 效果更好哈!...目标还是删除5,最后结果为[4,1,9]。我们把需要删除5结点后面节点1赋值给它,如下图8. ?

    1.3K20

    Swift 删除链表节点 - LeetCode

    LeetCode 题目: 删除链表节点 请编写一个函数,使其可以删除某个链表给定(非末尾)节点,你将只被给定要求被删除节点。...现有一个链表 -- head = 4,5,1,9,它可以表示为: 4 -> 5 -> 1 -> 9 示例1: 输入: head = [4,5,1,9], node = 5 输出: [4,1,9] 解释...: 给定你链表中值为 5 第二个节点,那么在调用了你函数之后,该链表应变为 4 -> 1 -> 9....示例2: 输入: head = [4,5,1,9], node = 1 输出: [4,5,9] 解释: 给定你链表中值为 1 第三个节点,那么在调用了你函数之后,该链表应变为 4 -> 5 -> 9...说明: 链表至少包含两个节点链表中所有节点值都是唯一。 给定节点为非末尾节点并且一定是链表一个有效节点。 不要从你函数返回任何结果。

    1.3K40
    领券