C语言每日一题:13《数据结构》环形链表。

这篇具有很好参考价值的文章主要介绍了C语言每日一题:13《数据结构》环形链表。。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

C语言每日一题:13《数据结构》环形链表。,数据结构,c语言,链表

题目链接:

一.环形链表运动基础。

使用快慢指针利用相对移动的思想:

1.第一种情况:

1,令快指针(fast)速度为2.
2.慢指针(slow)速度为1.
3.以慢指针进入环中开始。
4。假设slow刚刚进入环中fast与它相距N。

如图所示:
C语言每日一题:13《数据结构》环形链表。,数据结构,c语言,链表

2.第二种情况:

1,令快指针(fast)速度为3.M
2.慢指针(slow)速度为1.
3.以慢指针进入环中开始。
4。假设slow刚刚进入环中fast与它相距M。

如图所示:
C语言每日一题:13《数据结构》环形链表。,数据结构,c语言,链表
C语言每日一题:13《数据结构》环形链表。,数据结构,c语言,链表
C语言每日一题:13《数据结构》环形链表。,数据结构,c语言,链表

3.总结:

我们的距离改变是依靠相对速度而产生的相对距离。当相对速度为1的时候我们只要存在环就一定可以相遇。但是当相对速度为二的时候就相遇考虑之间的距离差值是奇数还是偶数所以判断链表带环的指针速度比较好的是:快指针(fast)速度为2.慢指针(slow)速度为1.

二.带环链表的进入环的节点。

假设:
1.链表无环部分长度:L
2.圆的周长为C
3.慢指针刚刚进入链表是快慢指针的距离为X

1.第一种情况。

1.当我们的环比较大的情况:

如图所示:
C语言每日一题:13《数据结构》环形链表。,数据结构,c语言,链表

2.第二种情况。

2.当我们的环比较小的时候:

如图所示:
C语言每日一题:13《数据结构》环形链表。,数据结构,c语言,链表
总结:环比较短的推导公式是可以通过n的变化适用于各种情况的。

3.两个思路

思路一:

1.依据我们L=(n-1)C+(C-X)作为理论依据。
2.重新定义两个节点一个从交点开始走每次走一步。
3.一个从头链表头开始走两个节点一定会相遇并且相遇的点就是进入点。

struct ListNode *detectCycle(struct ListNode *head) {
        struct ListNode* slow=head,*fast=head;
        //考虑带环还是不带环。
        while(fast&&fast->next)
        {
            //进行移动:
            slow=slow->next;
            fast=fast->next->next;

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

思路二:

1.假设我们没有理论依据。
2.找到节点之后可以转化成相交链表的问题。
3.找到节点之后把相遇节点的下一个置位空。
4.这样就分开了两个链表链表的位节点就是相遇点。
5.求两个链表的长度进行差距长的先走差距步。
6。一起走相等就是交点。文章来源地址https://www.toymoban.com/news/detail-624486.html

 struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {

    struct ListNode* curA=headA,*curB=headB;
    struct ListNode* tileA=headA,*tileB=headB;
    int lenA=1,lenB=1;

    while(tileA->next)
    {
        tileA=tileA->next;
        lenA++;
    }
    while(tileB->next)
    {
        tileB=tileB->next;
        lenB++;
    }

    if(tileA!=tileB)
    {
        //说明没有相交
        return NULL;
    }
    
    //说明一定相交
    int gap=abs(lenA-lenB);

    //2.谁比较大就先走差距步
    //假设
    struct ListNode* shortlist=headA,*longlist=headB;
    if(lenB<lenA)
    {
        //修正
        shortlist=headB;
        longlist=headA;
    }

    //长的先走差距补。
    while(gap--)
    {
        longlist=longlist->next;
    }

    while(shortlist&&longlist)
    {
        if(shortlist==longlist)
        {
            return longlist;
        }
        else
        {
            shortlist=shortlist->next;
            longlist=longlist->next;
        }
    }
    return NULL;
}
struct ListNode *detectCycle(struct ListNode *head) {
        struct ListNode* slow=head,*fast=head;
        //考虑带环还是不带环。
        while(fast&&fast->next)
        {
            //进行移动:
            slow=slow->next;
            fast=fast->next->next;

            if(slow==fast)
            {
                struct ListNode* meet=slow;
                struct ListNode* new=meet->next;
                meet->next=NULL;
                return getIntersectionNode(head,new); 
            }
        }
        return NULL;
       
}

到了这里,关于C语言每日一题:13《数据结构》环形链表。的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【数据结构OJ题】环形链表

    原题链接:https://leetcode.cn/problems/linked-list-cycle/description/ 目录 1. 题目描述 2. 思路分析 3. 代码实现 整体思路: 定义 快慢指针fast,slow ,如果 链表确实有环 , fast指针一定会在环内追上slow指针。 即慢指针一次走一步,快指针一次走两步,两个指针从链表起始位置开始运行,

    2024年02月12日
    浏览(40)
  • 【数据结构OJ题】环形链表II

    原题链接:https://leetcode.cn/problems/linked-list-cycle-ii/description/ 如果有小伙伴不了解环形链表,可以先看看这篇文章: https://blog.csdn.net/m0_62531913/article/details/132352203?spm=1001.2014.3001.5502 我们来看下图:  我们根据这个结论就可以做出这道题目了!

    2024年02月12日
    浏览(41)
  • 【数据结构】LeetCode升级版的环形链表,复制带随机指针的链表

              1、题目说明           2、题目解析           1、题目说明           2、题目解析      1、题目说明 题目链接: 升级版的环形链表  给定一个链表的头节点 head ,返回链表开始入环的第一个节点。  如果链表无环,则返回NULL。 如果链表中有某个节点,可以通

    2024年01月16日
    浏览(57)
  • 从零开始学习数据结构—【链表】—【探索环形链的设计之美】

    双向环形链表带哨兵,这个时候的 哨兵 , 可以当头,也可做尾 带哨兵双向循环链表:结构稍微复杂,实现简单。一般用来单独存储数据,实际中使用的链表数据结构都是带头双向链表。另外,这个结构虽然结构复杂,但是使用代码实现后会发现结构会带来很多优势。 双向

    2024年02月22日
    浏览(40)
  • 数据结构:带环单链表基础OJ练习笔记(leetcode142. 环形链表 II)(leetcode三题大串烧)

    目录 一.前言  二.leetcode160. 相交链表  1.问题描述 2.问题分析与求解 三.leetcode141. 环形链表 1.问题描述 2.代码思路  3.证明分析  下一题会用到的重要小结论: 四.leetcode142. 环形链表 II 1.问题描述 2.问题分析与求解 Judgecycle接口: 方法一: 方法二:  单链表和带环单链表

    2023年04月08日
    浏览(37)
  • 【每日一题】补档 CF487B. Strip | 数据结构杂烩 -> 单调队列 | 困难

    原题链接 给定一个长度为 n n n 的数组,将这个数组进行拆分成若干个连续子数组, 使得每个子数组的最大值减去最小值小于等于 s s s , 且每个子数组的长度大于等于 l e n len l e n 。 问最少可以拆分成多少个连续子数组,如果不可以,则输出 − 1 -1 − 1 1 ≤ n , l e n ≤ 1 0

    2024年02月06日
    浏览(49)
  • 【每日一题】移除链表元素(C语言)

    移除链表元素,链接奉上 在 正常 情况: 下我们移除链表元素时,需要该位置的 前结点与后节点 , 在 特别 情况时: 例如 我们发现,需要改变头结点,否则因为返回的 head 因为指向的位置被 free ,会导致程序错误 我们调试时可以在VS或其他的软件进行调试,也不用专门搞

    2024年02月05日
    浏览(54)
  • 【每日算法 && 数据结构(C++)】—— 13 | 求最长自增子序列(解题思路、流程图、代码片段)

    Today’s quote is: \\\"Actions speak louder than words. 今天的一句话是:“行动胜于言辞 求最长递增子序列 最长递增子序列是指在给定序列中,找到一个最长的子序列,使得子序列中的元素按照递增的顺序排列。 例如,对于序列 [1, 3, 2, 5, 4, 7, 6],其中的最长递增子序列可以是 [1, 2, 4,

    2024年02月12日
    浏览(39)
  • C语言数据结构--链表

    顺序表的问题及思考 问题: 1. 中间/头部的插入删除,时间复杂度为O(N) 2. 增容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗。 3. 增容一般是呈2倍的增长,势必会有一定的空间浪费。例如当前容量为100,满了以后增容到 200,我们再继续插入了5个数据,后面没有

    2024年02月05日
    浏览(42)
  • C语言数据结构——链表

    目录 前言 一、什么是链表 1.1链表的结构和概念 1.2 链表的分类 二、无头单向非循环链表 2.1 创建结构体 2.2 动态申请一个节点 2.3 单链表打印 2.4 单链表尾插/尾删 2.4.1 单链表尾插  2.4.2 单链表尾删 2.5 单链表头插/头删 2.5.1 头插 2.5.2 头删 2.6 单链表查找 2.7 单链表中间插入/中

    2024年02月16日
    浏览(53)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包