【Leetcode】移除链表元素 链表的中间节点 链表中倒数第k个节点

这篇具有很好参考价值的文章主要介绍了【Leetcode】移除链表元素 链表的中间节点 链表中倒数第k个节点。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【Leetcode】移除链表元素 链表的中间节点 链表中倒数第k个节点,Leetcode,链表,leetcode,数据结构,c语言,算法

【Leetcode】移除链表元素 链表的中间节点 链表中倒数第k个节点,Leetcode,链表,leetcode,数据结构,c语言,算法

目录

一.【Leetcode203】移除链表元素

1.链接

2.题目再现

 A.双指针法

B.类尾删法

C.哨兵位

二.【Leetcode876】链表的中间节点

1.链接:链表的中间节点

2.题目再现

3.解法:快慢指针

三.链表中倒数第k个节点

1.链接:链表中倒数第k个节点

2.题目再现

3.解法 :快慢指针


一.【Leetcode203】移除链表元素

1.链接

移除链表元素

2.题目再现

【Leetcode】移除链表元素 链表的中间节点 链表中倒数第k个节点,Leetcode,链表,leetcode,数据结构,c语言,算法

 A.双指针法

1.创建一个指针 cur=head  和一个指针  pre=NULL;  

2.用cur->val 与 val 比较,如果不相等则把 cur 赋给 pre 使cur 指向下一个节点,即

   cur=cur->next

3.如果相等则使 pre 的 next 指向 cur 的 next ,即:

 pre->next=cur->next ,然后再 free 掉 cur ,最后再使 cur 等于 pre 的 next,注意在进行这些步骤之前要判断 pre 是否为空 ,若为空即为头删;

演示:

双指针

代码:

struct ListNode* removeElements(struct ListNode* head, int val) 
{
    struct ListNode*pre=NULL;
    struct ListNode*cur=head;
    while(cur)
    {
        if(cur->val!=val)
        {
            pre=cur;
            cur=cur->next;
        }
        else 
        {
            if(pre==NULL)
            {
                head=cur->next;
                free(cur);
                cur=head;
            }
            else 
            {
                pre->next=cur->next;
                cur=pre->next;
            }
        }
    }
    return head;
}

B.类尾删法

1.创建一个新的指针newhead ,同时为了省去找尾的麻烦,我们可以定义一个尾指针 tail 来保存尾节点;

2.再创建一个指针 cur =head ,用来遍历链表;

3.如果 cur->val != val ,则尾插 ,注意要判断 tail 是否为空 ,类似于单链表的尾插那部分,如果不理解的话,可查看文章 :单链表的增删查改;

4.如果 cur->val ==val,则 cur=cur->next ;

5.最后要将尾节点置空。

演示:

类尾插

代码:

struct ListNode* removeElements(struct ListNode* head, int val) 
{
    struct ListNode *newhead=NULL;
    struct ListNode*tail=NULL;
    struct ListNode*cur=head;
    while(cur)
    {
        if(cur->val!=val)
        {
            if(tail==NULL)
            {
                newhead=tail=cur;
            }
            else 
            {
                tail->next=cur;
                tail=tail->next;
            }
            cur=cur->next;
        }
        else
        {
            cur=cur->next;
        }
    }
    if(tail)
    {
        tail->next=NULL;
    }
    return newhead;
}

C.哨兵位

1.malloc 一个哨兵位节点 dummyhead,使其 next 指向 head ;

2.再定义一个节点 tmp = dummyhead ,用这个遍历链表;

3.注意因为 tmp ->next 才是 head ,所以 while 里要写 tmp->next !=NULL

演示:

移除链表元素 哨兵位法动态演示

代码:

struct ListNode* removeElements(struct ListNode* head, int val) 
{
    struct ListNode*dummyhead=(struct ListNode*)malloc(sizeof(struct ListNode));
    dummyhead->next=head;
    struct ListNode*tmp=dummyhead;
    while(tmp->next!=NULL)
    {
        if(tmp->next->val==val)
        {
            tmp->next=tmp->next->next;
        }
        else 
        {
            tmp=tmp->next;
        }
    }
    return dummyhead->next;
}

二.【Leetcode876】链表的中间节点

1.链接:链表的中间节点

2.题目再现

【Leetcode】移除链表元素 链表的中间节点 链表中倒数第k个节点,Leetcode,链表,leetcode,数据结构,c语言,算法

3.解法:快慢指针

1.定义一个快指针 fast 和一个慢指针 slow 都初始化为 head;

2.遍历链表,快指针一次走2步,慢指针一次走1步 ;

3.注意:因为链表的长度可能是单数也可能是双数,所以当我们已 fast 是否为NULL 作为循环控制条件的话,要在 fast 走2步前判断 fast->next 是否为空

4.最后慢指针就是中间节点

演示:

链表中间节点 快慢指针动态演示

代码:

struct ListNode* middleNode(struct ListNode* head)
{
    struct ListNode*slow=head;
    struct ListNode*fast=head;
    while(fast)
    {
        if(fast->next==NULL)  //注意判断
        {
            break;
        }
        else
        {
            fast=fast->next->next;  //fast 走2步
        }
        slow=slow->next;   //slow 走1步
    }
    return slow;  //返回慢指针
}

三.链表中倒数第k个节点

1.链接:链表中倒数第k个节点

2.题目再现

【Leetcode】移除链表元素 链表的中间节点 链表中倒数第k个节点,Leetcode,链表,leetcode,数据结构,c语言,算法

3.解法 :快慢指针

1.定义一个快指针 fast 和一个慢指针 slow 都初始化为 head;

2.因为倒数第k个节点和尾节点的差为 k-1  ,所以我们先让快指针先走 k-1 步;

或者因为尾节点所指向的NULL 和倒数第k个节点相差k,也可以先让快指针走k步;

这个时候慢指针不动;

3.快指针走完后,快指针和慢指针依次走,每次只走1步

注意,如果是k-1,那么遍历结束的条件是fast->next 是否为空 ,如果是k,那么遍历结束的条件是fast 是否为空;

4.返回慢指针。

演示:

链表倒数第K个节点 快慢指针动态演示

代码:

struct ListNode* FindKthToTail(struct ListNode* pListHead, int k )
{
    if(pListHead==NULL)
    {
        return NULL;
    }
    struct ListNode*slow=pListHead;
    struct ListNode*fast=pListHead;
    while(k--)  //这里以先走k步为例
    {
        if(fast==NULL)
        {
            return NULL;
        }
        fast=fast->next;
    }
    while(fast)
    {
        slow=slow->next;
        fast=fast->next;
    }
    return slow;
}

😽本篇文章到此就结束了,若有错误或是建议,欢迎小伙伴们指出;😻

😍请多多支持博主哦~🥰

🤩谢谢你的阅读~😃

【Leetcode】移除链表元素 链表的中间节点 链表中倒数第k个节点,Leetcode,链表,leetcode,数据结构,c语言,算法文章来源地址https://www.toymoban.com/news/detail-791338.html

到了这里,关于【Leetcode】移除链表元素 链表的中间节点 链表中倒数第k个节点的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • LeetCode 203. 移除链表元素

    给你一个链表的头节点  head  和一个整数  val  ,请你删除链表中所有满足  Node.val == val  的节点,并返回  新的头节点  。   (1)直接使用原来的链表来进行移除节点操作: (2)设置一个虚拟头结点在进行移除节点操作:

    2024年02月15日
    浏览(35)
  • LeetCode 203.移除链表元素

    力扣题目链接

    2024年01月16日
    浏览(51)
  • 【 LeetCode题解 】203. 移除链表元素

    题目链接 : https://leetcode.cn/problems/remove-linked-list-elements/ 博客主页链接:Duck Bro 博客主页 关注博主,后期持续更新系列文章 ***感谢观看,希望对你有所帮助*** 🧐方案一 方案1:主要思路遇到val就删除,分为头删和中间删除两种情况。 当val在链表中间时,遇到val就删除链表中

    2024年02月09日
    浏览(47)
  • ( 链表) 203. 移除链表元素 ——【Leetcode每日一题】

    难度:简单 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。 示例 1: 输入: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 输出:[] 提示:

    2024年02月06日
    浏览(72)
  • 【单链表】LeetCode:203.移除链表元素

    🎁个人主页:我们的五年 🔍 系列专栏: 每日一练 🌷 追光的人,终会万丈光芒  前言: 该题是数据结构,单链表的一道基本题,刚刚准备学习数据结构,或者正在学习数据结构的可以学习一下。 题目链接:203. 移除链表元素 - 力扣(LeetCode) 最后喜欢的铁子们可以三连,

    2024年04月26日
    浏览(36)
  • LeetCode 刷题 数据结构 链表 203 移除链表元素

    Given the  head  of a linked list and an integer  val , remove all the nodes of the linked list that has  Node.val == val , and return  the new head . Example 1: Example 2: Example 3: Constraints: The number of nodes in the list is in the range  [0, 104] . 1 = Node.val = 50 0 = val = 50 今天leetcode的中文官网比较卡,所以是登录官网进行

    2024年02月14日
    浏览(36)
  • 【leetcode 力扣刷题】移除链表元素 多种解法

    题目链接:203.移除链表元素 题目内容: 理解题意:就是单纯的删除链表中所有值等于给定的val的节点。上一篇博客中介绍了链表的基础操作,在删除链表中节点时,需要注意的是头节点: 如果没有虚拟头节点,那么对头节点的删除需要做不同的处理,head = head-next; 如果有

    2024年02月12日
    浏览(48)
  • Leetcode刷题笔记题解(C++):203. 移除链表元素

    思路:不同的情况出现了,就是第一个节点要是为等于val的节点,可以新建一个节点,并next指向head,这样就可以遍历新的链表来删除节点

    2024年02月22日
    浏览(60)
  • 【代码随想录 | Leetcode | 第五天】链表 | 移除链表元素 | 设计链表 | 203-707

    欢迎来到小K的Leetcode|代码随想录|专题化专栏,今天将为大家带来移除链表元素和设计链表的分享 ✨ ✨题目链接点这里 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。 示例 1: 示例 2: 示例 3: 提示: 列表中

    2024年02月16日
    浏览(69)
  • Leetcode-每日一题【2487.从链表中移除节点】

    给你一个链表的头节点 head 。 对于列表中的每个节点 node ,如果其右侧存在一个具有 严格更大 值的节点,则移除 node 。 返回修改后链表的头节点 head 。 示例 1: 输入: head = [5,2,13,3,8] 输出: [13,8] 解释: 需要移除的节点是 5 ,2 和 3 。 - 节点 13 在节点 5 右侧。 - 节点 13 在

    2024年02月16日
    浏览(43)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包