算法刷题营【Day3】:: 链表篇:单链表结点删除思路:一题辨别哨兵结点的优势(删除有奇效):203. 移除链表元素

这篇具有很好参考价值的文章主要介绍了算法刷题营【Day3】:: 链表篇:单链表结点删除思路:一题辨别哨兵结点的优势(删除有奇效):203. 移除链表元素。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本内容是笔者结合《代码随想录》总结所得,记录学习过程,分享知识!


目录:
1. 开篇例题:203. 移除链表元素
2. 题解参考

- - 2.1 方法一:原表操作(不含哨兵结点)
- - 2.2 方法二:虚设哨兵结点辅助法
- - 2.3 方法三:递归法

3. 单链表结点删除思路

4. 方法思路点拨:原表操作(不含哨兵结点)

5. 方法思路点拨:虚设哨兵结点辅助法
6. 相关题集


1. 开篇例题:203. 移除链表元素

例题:点击直飞

算法刷题营【Day3】:: 链表篇:单链表结点删除思路:一题辨别哨兵结点的优势(删除有奇效):203. 移除链表元素


2. 题解参考

2.1 方法一:原表操作(不含哨兵结点)
class Solution {
public:
    // 基于原表操作
    ListNode* removeElements(ListNode* head, int val) {
    // 处理原表第一个结点是删除目标的情况
        while(head != NULL && head->val == val){
        // 头部操作只需移动头部标识
            ListNode* temp = head;
            head = head->next;
            delete temp;
        }
        ListNode* cur = head;
	// 处理删除原表中的目标结点
        while( cur && cur->next ){
        // 非头部操作:使用下文图中写的四部曲:双找一接后释放
            if( cur->next->val == val ){
                cur->next = cur->next->next;
            }
            else{
                cur = cur->next;
            }
        }
        return head;
    }
};
2.2 方法二:虚设哨兵结点辅助法
class Solution {
public:
    // 自定义虚设哨兵结点处理
    ListNode* removeElements(ListNode* head, int val) {
        ListNode* ph = new ListNode(0,head);    
        // 虚设哨兵结点,并指向原表首结点
        ListNode* temp = ph;
        while(temp->next){
            if(temp->next->val == val)
                temp->next = temp->next->next;
            else
                temp = temp->next;
        }
        return ph->next;
    }
};
2.3 方法三:递归法
class Solution {
public:
    // 递归算法处理
    ListNode* removeElements(ListNode* head, int val) {
        if(!head) return head;                          // 表空判断
        head->next =removeElements(head->next,val);     // 
        return head->val == val ? head->next : head;    // 
    }
};

3. 单链表结点删除思路

算法刷题营【Day3】:: 链表篇:单链表结点删除思路:一题辨别哨兵结点的优势(删除有奇效):203. 移除链表元素

对于单链表结点的删除操作,结合结点的定义方式

 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };

可知:链表中,前驱节点找到后继节点的方式是:通过前驱节点指针域来标识的!
如上图中的 1 -> 2 -> 3 链表中,如果我们想要删除 结点2,实际只需要让 结点1 的指针域指向 结点3 的结点即可(C/C++ 语言中推荐手动释放结点2)。
【核心代码如下:】

// cur 指向结点2,prev 指向结点1
// 删除代码:
prev->next = cur->next;
delete cur; 

由简单的代码可以看出,我们对于链表删除的关键点是:找到被删除目标结点,以及它的前驱结点!!!


4. 方法思路点拨:原表操作(不含哨兵结点)

注意题设:原题中不含哨兵结点,即 head->val 即得第一个结点值:1(如下图)

算法刷题营【Day3】:: 链表篇:单链表结点删除思路:一题辨别哨兵结点的优势(删除有奇效):203. 移除链表元素

结合上图可知:

  1. 如果删除的目标是第一个结点,我们只需要将 head 后移一位,并释放原第一个结点。
  2. 如果删除的目标不是第一个结点,我们需要使用两个指针,一个用于找到删除目标,另一个指向删除目标的前驱节点。
    如:删除结点值为 6 的第一个结点,我们需要用它的前驱结点指向被删除目标的后继结点。

算法刷题营【Day3】:: 链表篇:单链表结点删除思路:一题辨别哨兵结点的优势(删除有奇效):203. 移除链表元素

5. 方法思路点拨:虚设哨兵结点辅助法

注意题设:原题中不含哨兵结点,即 head->val 即得第一个结点值:1(如下图)

哨兵结点:简而言之就是在哨兵结点的第一个结点前设置一个结点,该节点内的数据域数据利用无意义。
特点:显然:ph->next = head; 即哨兵结点的下一个结点是原表的第一个结点。

算法刷题营【Day3】:: 链表篇:单链表结点删除思路:一题辨别哨兵结点的优势(删除有奇效):203. 移除链表元素

回顾哨兵结点的删除操作:

  1. 只要删除目标不是第一个结点:我们的删除操作都是四部曲,关键就在于找到删除目标的前驱结点。

此时,看向含哨兵结点的:

  1. 现在在原表首结点前增加一个结点,不就是实现了表中删除统一化操作:即:不用单独考虑对首结点的处理!!!

6. 相关题集

27. 移除元素【回顾数组/顺序表的元素移除操作】
237. 删除链表中的节点【指定结点删除:区别于本题,指定删除值为指定数据的结点】文章来源地址https://www.toymoban.com/news/detail-460084.html

到了这里,关于算法刷题营【Day3】:: 链表篇:单链表结点删除思路:一题辨别哨兵结点的优势(删除有奇效):203. 移除链表元素的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 算法刷题营【Day2】:: 双指针算法应用:滑动窗口 :209. 长度最小的子数组

    本内容是笔者结合《代码随想录》总结所得,记录学习过程,分享知识! 目录: 1. 开篇例题:209. 长度最小的子数组 2. 题解参考 - - 2.1 方法一:暴力法 - - 2.2 方法二:滑动窗口 3. 方法思路点拨:滑动窗口 - - 3.1 直白解释 - - 3.2 本题思路点拨 4. 相关题集 1. 开篇例题:209. 长度

    2024年02月04日
    浏览(35)
  • 算法刷题营【Day1】:: 27. 移除元素:快慢指针在顺序表中的应用与相关刷题

    本内容是笔者结合《代码随想录》总结所得,记录学习过程,分享知识! 目录: 1. 开篇例题:27. 移除元素 2. 题解参考 3. 题解思路 4. 相关题 [ - - 4.1 26. 删除有序数组中的重复项 ] [ - - 4.1 283. 移动零 ] 5. 相关题题解及简要思路 - - 5.1 26. 删除有序数组中的重复项 - - 5.1 283. 移动

    2024年02月06日
    浏览(83)
  • 什么是链表,如何实现?(单链表篇)

    欢迎来到 Claffic 的博客  💞💞💞       “仅仅活着是不够的,还需要有阳光,自由和花的芬芳。” 前言: 在日常使用的网站和软件中,列表属于最常见的一种东西了,其实现形式有顺序表,链表等,主要功能有 增删查改 ,那么链表具体是什么,如何实现?这篇博客为你

    2024年02月02日
    浏览(20)
  • 数据结构刷题训练——链表篇(二)

    目录 前言 1.题目一:链表分割 1.1 思路 1.2 分析  1.3 题解 2. 题目二:相交链表 2.1 思路 2.2 分析 2.3 题解 3. 题目三:环形链表 3.1 思路 3.2 分析 3.3 题解 总结         本期继续分享链表相关的OJ题目,在这个专栏博客中,我们将提供丰富的题目资源和解题思路,帮助读者逐步

    2024年02月14日
    浏览(29)
  • 数据结构刷题训练——链表篇(一)

    目录 前言 题目一:链表的中间节点 思路 分析 题解  题目二:链表中倒数第k个结点 思路 分析  题解 题目三:合并两个有序链表 思路 分析 题解  方法二 题解  题目四:链表的回文结构 思路 分析 题解 总结         今天我将开启一个新的专栏,数据结构与算法刷题训练营

    2024年02月14日
    浏览(23)
  • 数据结构刷题训练——链表篇(三)

    目录 文章目录 前言 1. 题目一:环形链表Ⅱ 1.1 思路 1.2 分析 1.3 题解 1.4 方法二 2. 题目二:复制带随机指针的链表 2.1 思路 2.2 分析 2.3 题解 总结         在这个专栏博客中,我们将提供丰富的题目资源和解题思路,帮助读者逐步提高解题能力。同时,我们也将分享一些刷题

    2024年02月13日
    浏览(26)
  • LeetCode刷题系列之----->(指针玩转链表篇)(三)

    🍉博客主页:阿博历练记 📖文章专栏:数据结构与算法 🔍代码仓库:阿博编程日记 🌹欢迎关注:欢迎友友们点赞收藏+关注哦 现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后

    2024年02月04日
    浏览(27)
  • Leetcode链表篇 Day2

    203. 移除链表元素 - 力扣(LeetCode) 1.暴力移除:分删除的为头结点和不为头节点 while删除头节点时:直接从下一个结点开始,head=head-next while不是头节点时:从head开始遍历(需记录的为 前继结点pre)   虚拟头结点法:无需分类讨论(头结点 or 非头结点) 1.创建虚拟头节点,连接

    2024年02月13日
    浏览(27)
  • 【Leetcode刷题】链表的中间结点和合并两个有序链表

    生命如同寓言,其价值不在与长短,而在与内容。                                ——塞涅卡 目录 一.链表的中间结点 1.快慢指针 二.合并两个有序链表  1.尾插法 给你单链表的头结点 head ,请你找出并返回链表的中间结点。 如果有两个中间结点,则返回第二个中间结点

    2023年04月17日
    浏览(31)
  • Leetcodes刷题之删除链表的倒数N个结点和删除链表的中间的结点

    吾心信其可行,则移山填海之难,终有成功之日。                           --孙中山 目录 🍉一.删除链表的倒数N个结点 🌻1.双指针 🍁2.求链表的长度 🌸二.删除链表的中间的结点 给你一个链表,删除链表的倒数第  n   个结点,并且返回链表的头结点。 示例 1: 示例

    2024年02月01日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包