LeetCode刷题系列之----->(指针玩转链表篇)(三)

这篇具有很好参考价值的文章主要介绍了LeetCode刷题系列之----->(指针玩转链表篇)(三)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🍉博客主页:阿博历练记
📖文章专栏:数据结构与算法
🔍代码仓库:阿博编程日记
🌹欢迎关注:欢迎友友们点赞收藏+关注哦

LeetCode刷题系列之----->(指针玩转链表篇)(三)

🖋1.题目描述

现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。

💡 逻辑分析

LeetCode刷题系列之----->(指针玩转链表篇)(三)

📃哨兵位的概念

哨兵位的头结点不存储有效数据,是一个附加的链表节点,该节点作为第一个节点,它的值域不存储任何东西.只是为了操作的方便而引入的,如果一个链表有哨兵节点的话,那么线性表的第一个元素应该是链表的第二个节点.

❌错误案例(不带哨兵位)

#include <cstddef>
class Partition {
public:
    ListNode* partition(ListNode* pHead, int x) {
        struct  ListNode*lesshead=NULL,*lesstail=NULL,*graterhead=NULL,*gratertail=NULL;
        struct  ListNode*cur=pHead;
        while(cur)
        {
            if(cur->val<x)
            {
               if(lesstail==NULL)
               {
                 lesshead=lesstail=cur;
               }
               else 
               {
                  lesstail->next=cur;
                  lesstail=lesstail->next;
               }
            }
            else
            {
               if(gratertail==NULL)
               {
                graterhead=gratertail=cur;
               }
               else 
               {
                 gratertail->next=cur;
                 gratertail=gratertail->next;
               }
            }
            cur=cur->next;
        }
        lesstail->next=graterhead;
        return    lesshead;
 }
};

LeetCode刷题系列之----->(指针玩转链表篇)(三)

✔代码纠正

1.不带哨兵位

#include <cstddef>
class Partition {
public:
    ListNode* partition(ListNode* pHead, int x) {
        struct  ListNode*lesshead=NULL,*lesstail=NULL,*graterhead=NULL,*gratertail=NULL;
        struct  ListNode*cur=pHead;
        while(cur)
        {
            if(cur->val<x)
            {
               if(lesstail==NULL)
               {
                 lesshead=lesstail=cur;
               }
               else 
               {
                  lesstail->next=cur;
                  lesstail=lesstail->next;
               }
            }
            else
            {
               if(gratertail==NULL)
               {
                graterhead=gratertail=cur;
               }
               else 
               {
                 gratertail->next=cur;
                 gratertail=gratertail->next;
               }
            }
            cur=cur->next;
        }
        if(lesstail==NULL)
        return   graterhead;
        else
        {
        lesstail->next=graterhead;
        if(gratertail)
        gratertail->next=NULL;
        return    lesshead;
        }
 }
};

2.带哨兵位

#include <cstddef>
class Partition {
public:
    ListNode* partition(ListNode* pHead, int x) {
        struct  ListNode*lesshead,*lesstail,*graterhead,*gratertail;
        lesshead=lesstail=(struct  ListNode*)malloc(sizeof(struct ListNode));
        graterhead=gratertail=(struct  ListNode*)malloc(sizeof(struct ListNode));
        struct  ListNode*cur=pHead;
        while(cur)
        {
            if(cur->val<x)
            {
                  lesstail->next=cur;
                  lesstail=lesstail->next;
            }
            else
            {
                 gratertail->next=cur;
                 gratertail=gratertail->next;
            }
            cur=cur->next;
        }
        lesstail->next=graterhead->next;
        gratertail->next=NULL;
        pHead=lesshead->next;
        free(lesshead);
        free(graterhead);
        return  pHead;
    }
};

友友们注意了,当我们用完哨兵位之后,我们要及时把它释放掉,返回链表新的头结点

🖋2.题目描述

LeetCode刷题系列之----->(指针玩转链表篇)(三)

📒 回文链表的概念(逻辑实现)

回文结构特征是正着读和反着读是一样的,因此我们只要找到链表的中间结点,再将链表的后半部分逆置,使用两个指针分别从头和中间结点开始遍历,如果在他们的next为空之前一直相等,说明该链表为回文结构

⭐疑问解析

LeetCode刷题系列之----->(指针玩转链表篇)(三)

🏆代码展示

class PalindromeList {
public:
 struct ListNode* reverseList(struct ListNode* head){
     struct  ListNode*cur=head;
     if(cur==NULL)
     {
         return  NULL;
     }
     struct  ListNode*rhead=NULL;
     struct  ListNode*next=cur->next;
     while(cur)
     {
     cur->next=rhead;
         rhead=cur;
         cur=next;
         if(cur)
         {
         next=cur->next;
         }
     }
     return  rhead;
}
struct ListNode* middleNode(struct ListNode* head){
     struct  ListNode*slow=head;
     struct  ListNode*fast=head;
     while(fast&&fast->next)
     {
         fast=fast->next->next;
         slow=slow->next;
     }
     return  slow;
}
bool chkPalindrome(ListNode* head){
     struct  ListNode*mid=middleNode(head);
     struct  ListNode*rmid=reverseList(mid);
     while(rmid)
     {
     if(rmid->val!=head->val)
        {
        return  false;
        }
        head=head->next;
        rmid=rmid->next;
     }
     return  true;
 }
 };

🖋3.题目描述

LeetCode刷题系列之----->(指针玩转链表篇)(三)

💡 逻辑分析

我们先求出链表A和链表B的长度L1和L2,使用双指针,并将他们对齐,即若A链表节点比B节点多n个,则将A的指针向后移动n个,B链表比A链表多时同理.保证剩余链表长度相同,然后在一起走,两个指针同步向后移动1个节点,要么同时找到第一个交点,要么都为NULL.文章来源地址https://www.toymoban.com/news/detail-440135.html

🏆代码展示

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
    int t1=0;
    int t2=0;
    struct  ListNode*p1=headA;
    struct  ListNode*p2=headB;
    if(p1==NULL||p2==NULL)
    return  NULL;
    while(p1)
    {
        t1++;
        p1=p1->next;
    }
    p1=headA;
    while(p2)
    {
        t2++;
        p2=p2->next;
    }
    p2=headB;
    if(t1>t2)
    {
    int temp=t1-t2;
       while(temp)
       {
           p1=p1->next;
           temp--;
       }
    }
    else
    {
        int  temp=t2-t1;
        while(temp)
        {
            p2=p2->next;
            temp--;
        }
    }
    while(p1&&p1!=p2)
    {
        p1=p1->next;
        p2=p2->next;
    }
    return  p1;
}

到了这里,关于LeetCode刷题系列之----->(指针玩转链表篇)(三)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 数据结构刷题训练——链表篇(三)

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

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

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

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

    目录 前言 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日
    浏览(31)
  • LeetCode刷题系列之《双指针解数组》

    各位csdn的友友们好啊,今天阿博给大家分享几道leetcode上的经典数组题,通过这次的学习,相信友友们可以更全面的认识指针和数组🍉🍉🍉 一.题目描述 给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。

    2023年04月26日
    浏览(30)
  • Leetcode链表篇 Day2

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

    2024年02月13日
    浏览(30)
  • 算法刷题营【Day3】:: 链表篇:单链表结点删除思路:一题辨别哨兵结点的优势(删除有奇效):203. 移除链表元素

    本内容是笔者结合《代码随想录》总结所得,记录学习过程,分享知识! 目录: 1. 开篇例题:203. 移除链表元素 2. 题解参考 - - 2.1 方法一:原表操作(不含哨兵结点) - - 2.2 方法二:虚设哨兵结点辅助法 - - 2.3 方法三:递归法 3. 单链表结点删除思路 4. 方法思路点拨:原表操

    2024年02月06日
    浏览(36)
  • 链表刷题常用技巧——快慢指针

    强大,不动如山的强大,不会输给自己的真正的强大。  往期回顾: 数据结构——单链表 单链表力扣刷题 文章目录 经典例题:链表的中间结点 题目分析及双指针思路引入  双指针图解 leetcode 核心代码 判断环形链表——快慢指针延伸为追及问题 题目分析,图解 leetcode 核心

    2024年02月14日
    浏览(28)
  • LeetCode算法小抄 -- 链表(快慢指针、双指针、回文链表)

    ⚠申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址。 全文共计10077字,阅读大概需要10分钟 🌈更多学习内容, 欢迎👏关注👀文末我的个人微信公众号:不懂开发的程序猿 个人网站:https://jerry-jy.co/ Collection 子接口之 Queue (LeetCode上经常用,手撕算法题!

    2023年04月08日
    浏览(27)
  • LeetCode刷题 --- 链表

    定义一个node节点 206 反转链表 题目:给你单链表的头节点  head  ,请你反转链表,并返回反转后的链表。 解题: 1、如果head为空或者只有一个节点,那么直接返回结果即可 2、否则,定义一个新链表,遍历旧链表,将每个节点插入到新链表的头部即可。 203 根据值来删除节点

    2024年02月05日
    浏览(29)
  • leetcode算法刷题——链表

    题意:删除链表中等于给定值 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 输出:[] 在链表类中实现这些功能: get(index):获取链表中第 index 个节点的值。如果索引无效,

    2024年02月21日
    浏览(36)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包