一个简短的补充------对链表练习题的补充补充

昨天不是写了一篇有关链表的数据结构练习题嘛,其实那篇文章的第二道题还有许多值得我们思考的东西,今天就在这做一个简短的补充。补充一下运用那道题解决另一道题。 
给大家看一下绿色让眼睛放松一下。 


 

给定一个链表的头节点  head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。

这道题跟我说的昨天第二道题十分相似,但确实它的进阶版,这里我们要解决的是,除了判断它是否有环,还需找出它的环是哪个节点,这样一看,这题目好像确实是难上加难了,但是问题总是有对应的方法去解决的,这里我们不得不先丢出一个结论,大家先看等下我再解释。

结论: 一个指针从相遇的点走,另一个从链表的开头走,那么这两个指针一定会在入环的节点相遇。

那么现在我们给大家证明一下这个结论:

我们设不为环的地方为L,环的周长为C,N为正整数变量, 那么我们知道L的距离要么使C-X,异或N*C-X,那么只要相遇那么只要两指针往后走,那就一定可以在入环的位置相遇。

那么这时我们就可以根据这个结论解决这道题目了。

 

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode *detectCycle(struct ListNode *head) {
    if(head==NULL)
    {
        return NULL;
    }
struct ListNode * fast=head;
struct ListNode * slow=head;

while(fast && fast->next)
{


fast=fast->next->next;
slow=slow->next;
if(slow==fast)
{

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

}

}

return NULL;

}

代码解析:我们通过第一个while循环找到有环链表的相遇位置meet,然后我们就可以让head和meet开始走,直到相遇,那么这个相遇的位置就是环的入口位置了。


那么这篇文章就结束了。

相关推荐

  1. Python 学习 第二册 第一册一些补充

    2024-02-22 15:24:02       30 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-22 15:24:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-22 15:24:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-02-22 15:24:02       82 阅读
  4. Python语言-面向对象

    2024-02-22 15:24:02       91 阅读

热门阅读

  1. 微众银行:始于数字原生,立于普惠金融

    2024-02-22 15:24:02       53 阅读
  2. 主流无人机开源飞控

    2024-02-22 15:24:02       53 阅读
  3. 大模型中的token是什么?

    2024-02-22 15:24:02       52 阅读
  4. windows命令行加入与移除管理员组

    2024-02-22 15:24:02       57 阅读
  5. SpringBoot项目启动后执行指定方法的四种实现

    2024-02-22 15:24:02       53 阅读
  6. react中useState、setState、usemeno、meno区别

    2024-02-22 15:24:02       47 阅读
  7. 路由器配置DMZ主机映射

    2024-02-22 15:24:02       73 阅读
  8. 提升爬虫效率:多线程,多进程,多协程

    2024-02-22 15:24:02       45 阅读