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

本文详细解析了在单向链表中删除特定值节点的算法实现,提供了多种C++代码解决方案,包括直接删除和使用哑节点的方法,适用于链表操作初学者及进阶者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

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

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

示例 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 被删除的节点

解题代码

个人做法

class Solution {
public:
    ListNode* deleteNode(ListNode* head, int val) {
        ListNode* cur = head, * pre = head->next;
        if(cur->val == val) {
            head = head->next;
            return head;
        }
        while(pre->val != val){
            pre = pre->next;
            cur = cur->next;
        }
        cur->next = pre->next;
        return head;
    }
};

在这里插入图片描述

少定义一个节点也会对时间和内存消耗有帮助。

其他作者的解法

作者:Orange

class Solution {
public:
    ListNode* deleteNode(ListNode* head, int val) {
        ListNode* dummy = new ListNode(-1); 
        dummy->next = head; //建立虚拟头节点
        ListNode* cur = dummy;
        while(cur->next) 
            if(cur->next->val == val) cur->next = cur->next->next;
            else cur = cur->next;
        return dummy->next;
    }
};

接近双百。

思路

  1. 定义一个哑节点,哑节点在头节点的前面。

哑节点的作用:哑节点(dummy node)是初始值为NULL的节点,创建在使用到链表的函数中,可以起到避免处理头节点为空的边界问题的作用,减少代码执行异常的可能性。

哑节点的使用可以对代码起到简化作用(省略当函数的入口参数为空时的判断)

  1. 后面思路和自己的思路一样。

作者:RT Huang

class Solution {
public:
    ListNode* deleteNode(ListNode* head, int val) {
        if(head==NULL)return NULL;
        if(head->val==val)return head->next;
        ListNode *p=head;
        while(p->next){
            if(p->next->val==val){
                p->next=p->next->next;
                break;
            }
            p=p->next;
        }
        return head;
    }
};

思路清晰,对head节点的分析明确。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值