删除链表的节点

简介: 删除链表的节点

剑指 Offer 18. 删除链表的节点


给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。


返回删除后的链表的头节点。


注意:此题对比原题有改动


示例 1:


输入: head = [4,5,1,9], val = 5

输出: [4,1,9]

解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.

示例 2:


输入: head = [4,5,1,9], val = 1

输出: [4,5,9]

解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9.


说明:


题目保证链表中节点的值互不相同

若使用 C 或 C++ 语言,你不需要 free 或 delete 被删除的节点


解题思路


结构图大体如下


50cb5a5382f64a028dfda87abac22735.png

我们假设储存的四个值是 4 5 1 9


要删除的值是 5


我们大概来看一下思路


4968eeb1a8b4459ea494cb55084ae8cd.png

这里我们可以发现 我们找到要删除的值的时候


这个时候我们需要做三件事


第一 将前面的next指向被删除下面一个结构体的指针


第二 释放cur的位置


第三 cur前面的位置指向下面一个结构体的位置


b0e2351a36f24c0b976b27f12e1b0c05.png


那么如果说像现在的这种情况 后面没有要删除的值了 就可以一直cur指向下一个位置


那么我们想想看 指向什么位置才可以结束呢?


72b68f9ea3444a1d9648159b63d8d4c0.png


我们可以发现 当cur指向空的时候 循环条件就可以结束了


当然 这里有一个


特殊情况


就是如果说 第一个值就是我们要找的值

a3f0d702a821406183bc040d6d36dffd.png


这个时候pre指向的还是空指针


这里我们就要用到头删


164c306fa0ba4d2ebbfd1c360cd31661.png

这个时候我们只需要用头删就可以了


代码源码


代码源码表示如下


struct ListNode* deleteNode(struct ListNode* head, int val)
{
    // 创建需要用到的指针 
    struct ListNode* cur = (struct ListNode*)malloc(sizeof(struct ListNode));
    struct ListNode* pre = (struct ListNode*)malloc(sizeof(struct ListNode));
    pre = NULL;
    cur = head;
    // 还有一种特殊情况 那就是当头就是要找的值的时候 下面的代码就不适用了 所以说我们这里要添加一个特殊情况 头部就是要找的值
    // 按照一般情形的代码
    while (cur != NULL)
    {
        while (head->val == val)
        {
            cur = head;
            head = head->next;
            free(cur);
            cur = head;
        }
        if (cur->val != val)
        {
            pre = cur;
            cur = cur->next;
        }
        else
        {
            pre->next = cur->next;
            free(cur);
            cur = pre->next;
        }
    }
    //但是上面的代码只能循环一次  想要删除掉所有的数 我们只需要在上面添加一个条件
    return head;
}
相关文章
|
6月前
|
存储 Python
链表中插入节点
链表中插入节点
|
29天前
LeetCode第二十四题(两两交换链表中的节点)
这篇文章介绍了LeetCode第24题的解法,即如何通过使用三个指针(preNode, curNode, curNextNode)来两两交换链表中的节点,并提供了详细的代码实现。
15 0
LeetCode第二十四题(两两交换链表中的节点)
|
29天前
Leetcode第十九题(删除链表的倒数第N个节点)
LeetCode第19题要求删除链表的倒数第N个节点,可以通过快慢指针法在一次遍历中实现。
38 0
Leetcode第十九题(删除链表的倒数第N个节点)
|
22天前
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
40 0
|
3月前
|
算法
LeetCode第24题两两交换链表中的节点
这篇文章介绍了LeetCode第24题"两两交换链表中的节点"的解题方法,通过使用虚拟节点和前驱节点技巧,实现了链表中相邻节点的交换。
LeetCode第24题两两交换链表中的节点
05_删除链表的倒数第N个节点
05_删除链表的倒数第N个节点
04_两两交换链表中的节点
04_两两交换链表中的节点
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 22. 链表中倒数第k个节点
Leetcode题目"剑指 Offer 22. 链表中倒数第k个节点"的Python解决方案,使用双指针法找到并返回链表中倒数第k个节点。
50 5
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 18. 删除链表的节点
Leetcode题目"剑指 Offer 18. 删除链表的节点"的Python解决方案,通过使用双指针法找到并删除链表中值为特定数值的节点,然后返回更新后的链表头节点。
40 4
|
4月前
|
安全 云计算
云计算自旋锁问题之在线程安全地删除链表节点时,需要频繁加锁会影响性能如何解决
云计算自旋锁问题之在线程安全地删除链表节点时,需要频繁加锁会影响性能如何解决
49 2