【数据结构】单链表OJ题(二)

这篇具有很好参考价值的文章主要介绍了【数据结构】单链表OJ题(二)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【数据结构】单链表OJ题(二),数据结构,数据结构,c++,算法,c语言,链表

🔥博客主页:小王又困了

📚系列专栏:数据结构

🌟人之为学,不日近则日退 

❤️感谢大家点赞👍收藏⭐评论✍️


目录

一、链表分割

💡方法一:

二、链表的回文

💡方法一: 

三、相交链表

💡方法一: 

四、环形链表

 💡方法一: 


🗒️前言:

在上一期中我们给大家介绍了单链表,也了解了单链表的实现。接下来就让我们进入实践,练习一些经典题目,让我们对单链表的理解更加深入

一、链表分割

题目:

【数据结构】单链表OJ题(二),数据结构,数据结构,c++,算法,c语言,链表

💡方法一:

我们创建两条链表,把小于x的节点放在一条链表中,剩余的放在另一条节点,最后将两条链表连接起来。在这里要使用带哨兵位的链表,不用考虑头插和第一条链表为空的问题,可以大大减少代码量。

【数据结构】单链表OJ题(二),数据结构,数据结构,c++,算法,c语言,链表

 注意:要将链表最后一个节点的指针域置为空,不然会导致链表循环。

ListNode* partition(ListNode* pHead, int x) 
{
    struct ListNode* lhead ,*ltail,*ghead,*gtail;
    ghead=gtail=(struct ListNode*)malloc(sizeof(struct ListNode));
    lhead=ltail=(struct ListNode*)malloc(sizeof(struct ListNode));
    struct ListNode* cur=pHead;
    while(cur)
    {
         if(cur->val<x)
         {
             ltail->next=cur;
             ltail=ltail->next;
         }
         else  
         {
              gtail->next=cur;
              gtail=gtail->next;
         }
         cur=cur->next;
    }


    ltail->next=ghead->next;
    gtail->next=NULL;

    struct ListNode* head=lhead->next;
    free(ghead);
    free(lhead);

    return head;
}

二、链表的回文

题目:

【数据结构】单链表OJ题(二),数据结构,数据结构,c++,算法,c语言,链表

💡方法一: 

我们先找到中间节点,然后将后面的节点反转,分别从头节点和中间节点开始比较,如果两两节点的数据域有一对不相等,返回flase;如果都相等返回true。

class PalindromeList {
  public:
  //找中间节点
    struct ListNode* middleNode(struct ListNode* head) {
        struct ListNode* fast = head;
        struct ListNode* slow = head;
        while (fast && fast->next) {
            fast = fast->next->next;
            slow = slow->next;
        }
        return slow;
    }

    //反转链表
    struct ListNode* reverseList(struct ListNode* head) {
        struct ListNode* cur = head;
        struct ListNode* newnode = NULL;
        while (cur) {
            //保存节点
            struct ListNode* next = cur->next;

            //头插
            cur->next = newnode;
            newnode = cur;
            cur = next;
        }
        return newnode;
    }
    bool chkPalindrome(ListNode* head) 
    {   
        struct ListNode* mid=middleNode(head);
        struct ListNode* rmid=reverseList(mid);

        struct ListNode* cur=head;
        while(rmid&&cur)
        {
            if(rmid->val!=cur->val)
            {
                return false;
            }
            else 
            {
                rmid=rmid->next;
                cur=cur->next;
            }
            
        }
        return true;
    }
};

三、相交链表

题目:

【数据结构】单链表OJ题(二),数据结构,数据结构,c++,算法,c语言,链表

💡方法一: 

在做这道题,我们可以分为两步:

1.判断是否相交:

        遍历两条链表,比较最后一个节点的地址,地址相等,说明两条链表相交。

2.找起始节点:

        先计算出两条链表的长度,计算出它们的差值,让长的链表先走差距步,然后两条链表一起走,相等时返回的就是相交的起始节点。

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) 
{
    struct ListNode* curA=headA,*curB=headB;
    int lenA=1,lenB=1;
    while(curA->next)
    {
        curA=curA->next;
        lenA++;
    }
    while(curB->next)
    {
        curB=curB->next;
        lenB++;
    }
    if(curA->next!=curB->next)
    {
        return NULL;
    }

    //求两链表的差距
    int gap=abs(lenA-lenB);

    struct ListNode* longlist=headA,*shortlist=headB;
    if(lenA<lenB)
    {
        longlist=headB;
        shortlist=headA;
    }
    //长链表先走差距步
    while(gap--)
    {
        longlist=longlist->next;
    }
    while(longlist!=shortlist)
    {
        longlist=longlist->next;
        shortlist=shortlist->next;
    }
    return longlist;
}

四、环形链表

题目:

【数据结构】单链表OJ题(二),数据结构,数据结构,c++,算法,c语言,链表

 💡方法一: 

 当我们定义快慢指针,快指针一次走两步,慢指针一次走一步。如果链表存在环,在进入环中快指针一定可以追上慢指针。因为每走一步距离就减1,当减到0时就追上了。

  • 假设起点到入口点距离为L
  • 假设环的周长为C
  • 假设入口点到相遇点的距离为X

我们通过快慢指针走过的路程来判断,但在这里要注意环的周长很小时,所以在这里要考虑两种情况: 

【数据结构】单链表OJ题(二),数据结构,数据结构,c++,算法,c语言,链表

情况一:slow进环后一圈之内,fast一定追上slow

  • slow走的距离:L+X
  • fast走的距离:L+C+X

情况二:slow进环时,fast已经走了n圈

  • slow走的距离:L+X
  • fast走的距离:L+nC+X 

由于快指针速度使慢指针的二倍,所以快指针走的路程也是慢指针的二倍。由此可得出:
【数据结构】单链表OJ题(二),数据结构,数据结构,c++,算法,c语言,链表

结论:慢指针从起点开始走,快指针从相遇点开始走,它们最终会相遇在入口点。

struct ListNode *detectCycle(struct ListNode *head) 
{
    struct ListNode* slow,* fast;
    slow=fast=head;
    while(fast&&fast->next)
    {
        slow=slow->next;
        fast=fast->next->next;
        if(fast==slow)
        {
            struct ListNode* meet=fast;
            while(head!=meet)
            {
                meet=meet->next;
                head=head->next;
            }
            return meet;
        }
    }
    return NULL;
}

本次的内容到这里就结束啦。希望大家阅读完可以有所收获,同时也感谢各位读者三连支持。文章有问题可以在评论区留言,博主一定认真认真修改,以后写出更好的文章。你们的支持就是博主最大的动力。文章来源地址https://www.toymoban.com/news/detail-632600.html

到了这里,关于【数据结构】单链表OJ题(二)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【数据结构与算法】:10道链表经典OJ

    思路1:遍历原链表,将 val 所在的节点释放掉。(太麻烦) 思路2:创建新链表,再遍历原链表,找到不为 val 的节点尾插到新链表。 思路1代码实现如下: 注意: 1.当链表为空时,直接返回NULL即可。 2.当尾插上最后一个有效节点时,此时它的 next 可能还与最后一个节点相链接,

    2024年04月14日
    浏览(29)
  • 【数据结构】链表OJ题(顺序表)(C语言实现)

    ✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ 🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿 🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟 🌟🌟 追风赶月莫停留 🌟🌟 🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀 🌟🌟 平芜尽处是春山

    2024年02月05日
    浏览(37)
  • (c语言实现)数据结构链表oj题(2)

    🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨ 🐻推荐专栏: 🍔🍟🌯C语言进阶 🔑个人信条: 🌵知行合一 🍉本篇简介::分析力扣中有关链表的部分题目. 题目来源于:牛客网-题目链接 输入一个链表,输出该链表中倒数第k个结点。 示例: 输入:1,{1,2,3,4,5} 返回值:{5} 创建两个指针: ①

    2024年02月04日
    浏览(45)
  • [C语言][数据结构][链表] 单链表的从零实现!

    目录 零.必备知识 1.一级指针 二级指针 2. 节点的成员列表     a.数据     b.指向下一个节点的指针. 3. 动态内存空间的开辟 (malloc-calloc-realloc) 一.单链表的实现与销毁          1.1 节点的定义         1.2 单链表的尾插         1.3 单链表的头插         1.4 单链表的尾删  

    2024年04月11日
    浏览(36)
  • 『初阶数据结构 • C语言』⑨ - 基于结点的数据结构——链表(单链表&&双向循环链表)附完整源码

      本章内容 1.什么是链表 2.链表常见几种形式 3.无头单向非循环链表的实现 3.1结点结构的定义 3.2函数接口的实现 3.2.1尾插 3.2.2尾删 4. 带头双向循环链表的实现 4.1结点结构的定义 4.2函数接口的实现 5.两种链表的差异 ①尾插与尾删的时间复杂度 ②头插与头删的时间复杂度 ③

    2024年02月16日
    浏览(60)
  • 【数据结构与算法】一套链表 OJ 带你轻松玩转链表

    ✨个人主页:bit me ✨当前专栏:数据结构 ✨刷题专栏:基础算法   简介: 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。 示例1: 输入:head = [1,2,6,3,4,5,6], val = 6 输出:[1,2,3,4,5] 示例2: 输入:head = [], val =

    2024年01月22日
    浏览(37)
  • 【数据结构与算法】顺序表与链表(单链表和双链表)超详解图示与源码。

                                                       大家好,今天我们来学习数据结构中的顺序表与链表!源码在最后附上 首先我们先来认识一下 顺序表 :                                       **如上图所示:很多人会以为数组就是顺序表,顺序表就是数组,这

    2024年02月21日
    浏览(36)
  • 数据结构——单链表OJ题

    在前面的博客中我们知道了什么是单链表以及如何建立单链表! 现在让我们来检验一下学习成果吧! 提示:此博客中题目均来自牛客网以及力扣网!在题目中我会附带两大网站的链接,大家也可以去练习一下! 若有链接问题可以在评论区及时反馈! 题目链接: OJ链接 提示

    2024年02月14日
    浏览(73)
  • 【数据结构】单链表OJ题

    🔥 博客主页: 小王又困了 📚 系列专栏: 数据结构 🌟 人之为学,不日近则日退  ❤️ 感谢大家点赞👍收藏⭐评论✍️ 目录 一、移除链表元素 💡方法一: 💡方法二: 二、链表的中间节点 💡方法一: 三、链表中倒数第k个结点 💡方法一: 四、反转链表 💡方法一:

    2024年02月14日
    浏览(51)
  • 数据结构--单链表OJ题

    上文回顾---单链表 这章将来做 一些链表的相关 题目 。 目录 1.移除链表元素 2.反转链表 3.链表的中间结点 4.链表中的倒数第k个结点 5.合并两个有序链表 6.链表分割 7.链表的回文结构 8.相交链表 9.环形链表 ​编辑  10.环形链表II ​编辑 ​编辑    思路:我们可以 通过循环链

    2024年02月14日
    浏览(65)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包