IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【LeetCode】移除链表元素(203. 题)| 图解算法思路,超详细哦~ -> 正文阅读

[数据结构与算法]【LeetCode】移除链表元素(203. 题)| 图解算法思路,超详细哦~

《题目难度:简单》

(1)题目描述

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点

示例1:

img

输入:head = [1, 2, 6, 3, 4, 5, 6],val = 6

输出:[1, 2, 3, 4, 5]

示例2:

输入:head = [ ],val = 1

输出:[ ]

示例3:

输入:head = [7, 7, 7, 7], val = 7

输出:[ ]

LeetCode链接:203. 移除链表元素


(2)解题思路

1)思路1:找到等于 val 的节点直接删除

  • 定义一个指针 cur,用来遍历链表,找到等于 val 的节点

  • 定义一个指针 prev,保存 cur 的上一个节点的位置

  • 定义一个指针 next,保存 cur 的下一个节点的位置,用来迭代

  • 首先判断 cur 指向节点的值是否等于 val:

  • 如果等于,则要删除这个节点。我们需要将 prev->next 指向 next 指针,然后 free(cur),再将 cur 往前移动到 next 指针的位置,这样就完成对这个节点的删除啦

image-20210830204816063
  • 如果不等于,只需要将 prev 指针和 cur 指针往前移动一位即可,继续遍历链表寻找等于 val 的节点
  • 最后返回头节点指针 head 即可
  • 需要考虑这一点

如果要删除的节点是头节点,所以在删除的时候需要额外判断一下是不是头结点

image-20210830210523275
  • 代码如下
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */

struct ListNode* removeElements(struct ListNode* head, int val){
    //解题思路:遍历链表,找到满足Node.val == val的节点
    struct ListNode* cur = head;
    struct ListNode* prev = head;  //保存cur的上一个节点位置
    while(cur != NULL)  //遍历链表
    {
        if(cur->val == val)  //找到等于val的节点
        {
            struct ListNode* next = cur->next;  //保存cur的下一个节点位置
            if(head == cur)  //判断cur是否是头节点
            {
                head = next;
            }
            else
            {
                prev->next = next;  //将cur上一个节点和cur下一个节点相连
            }
            free(cur);  //删除等于val的节点
            cur = next;
        }
        else if(cur->val != val)
        {
            prev = cur;
            cur = prev->next; 
        }
    }
    return head;
}

2)思路2:将不等于 val 的节点尾插到一个新链表中

  • 把链表中所有不等于 val 的节点尾插到一个新链表中,相当于删除了等于val的节点
  • 定义一个指针 cur,用来遍历原链表,找到不等于 val 的节点
  • 定义一个指针 newhead,指向新链表的头节点
  • 定义一个指针 tail,保存新链表尾节点的位置
image-20210830211433874
  • 首先判断 cur 指向节点的值是否不等于 val:

  • 如果不等于,则需要将其尾插到新链表中,首次尾插时,新链表为空,我们让 newhead 指向 cur,然后让 tail 指向 cur,更新新链表的尾节点,cur 往后移动一位,指向待遍历的下一个节点,最后将尾节点的 next 指针置空。

image-20210830213802614
  • 如果等于,则要删除这个节点。定义一个指针 next 保存 cur 的下一个节点的位置,然后 free(cur),再将 cur 移动到 next 的位置,继续遍历原链表。
  • 最后返回新链表的头节点指针 newhead 即可
  • 代码如下
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */

struct ListNode* removeElements(struct ListNode* head, int val){
    //解题思路:把链表中所有不等于val的节点尾插到一个新链表中,相当于删除了等于val的节点
    struct ListNode* newhead = NULL;  //新链表初始为空
    struct ListNode* tail = newhead;  //记录新链表尾节点的位置
    struct ListNode* cur = head;
    while(cur != NULL)
    {
        if(cur->val != val)  //把链表中所有不等于val的节点尾插到一个新链表中
        {
            if(newhead == NULL)  //新链表为空时
            {
                newhead = cur;
            }
            else  //新链表不为空时
            {
                tail->next = cur;
            }
            tail = cur;  //更新尾节点
            cur = cur->next;  //cur指向原链表中的下一个节点
            tail->next = NULL;  //将尾节点置空
        }
        else if(cur->val == val)
        {
            struct ListNode* next = cur->next;  //保存cur的下一个节点位置
            free(cur);  //删除等于val的节点
            cur = next;
        }
    }
    return newhead;
}

大家快去动手练习一下吧!

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-09-01 12:10:49  更:2021-09-01 12:10:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 0:42:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码