当前位置: 首页 > article >正文

【数据结构篇】~链表算法题3(环形链表)

链表算法题3(环形链表)

  • 环形链表的证明
  • 1. 环形链表I​
    • 1) 思路
    • 2)代码实现
  • 2. 环形链表II​
    • 1) 思路1
    • 1) 思路2
    • 2)代码实现

请添加图片描述

环形链表的证明

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

1. 环形链表I​

在这里插入图片描述

https://leetcode.cn/problems/linked-list-cycle/description/

1) 思路

在这里插入图片描述

判断链表是否带环,还是要使用快慢双指针,如果带环那他们一定在环中相遇,如果没带环那么就返回false

2)代码实现

typedef struct ListNode ls;
bool hasCycle(struct ListNode *head) {
    ls*slow=head,*fast=head;
    //开始循环
    while(fast && fast->next)//分为奇数偶数两种情况所以要fast&&fast->next
    {
        slow=slow->next;
        fast=fast->next->next;
        if(slow==fast)
        return true;
    }
    return false;   
}

2. 环形链表II​

https://leetcode.cn/problems/linked-list-cycle-ii/description/​

在这里插入图片描述
在这里插入图片描述

1) 思路1

找到相遇节点,然后把相遇节点的next指针置为newnode,再把meet->next置为空,这时再找入环节点就可以转化为找相交链表的相交节点

1) 思路2

找到相遇节点后然后开时循环,让相遇节点和头节点同时同步走,直到两个指针相遇时,就找到了入环节点

2)代码实现

typedef struct ListNode lsnode;
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB)
{
    lsnode*l1=headA;
    lsnode*l2=headB;
    int sizea=0;int sizeb=0;
    while(l1)
    {
       ++sizea;
        l1=l1->next;      
    }
    while(l2)
    {
        ++sizeb;
        l2=l2->next;     
    }
    //计算a和b的长度,让长的先走差值步,到同一起点上
     lsnode* plong = headA;
    lsnode* pshort = headB;
    if(sizeb>sizea)
    {
        plong= headB;
        pshort=headA;
    }
    

    int gap=abs(sizea-sizeb);
    while(gap--)
    {
        plong = plong -> next;
    }
    //开始比较
    while(plong && pshort)
    {
        //这里比较地址,如果比较值得话有问题
        if(plong == pshort)
       { 
        return pshort;
       }
       //同步走
        plong=plong->next;
        pshort=pshort->next;    
    }
    return NULL;   
}
struct ListNode *detectCycle(struct ListNode *head) 
{
    lsnode*slow=head,*fast=head;
    while(fast && fast->next)
    {
        slow=slow->next;
        fast=fast->next->next;
        if(slow==fast)
        {
            lsnode*meet=slow;//相遇节点
            lsnode*newhead=meet->next;
            meet->next=NULL;//变为了相交链表找相交节点
            return getIntersectionNode(head,newhead);
        }       
    }  
     return NULL;
}

```c
typedef struct ListNode  lsnode;
struct ListNode *detectCycle(struct ListNode *head) 
{
     lsnode*slow=head,*fast=head;
    while(fast && fast->next)
    {
        slow=slow->next;
        fast=fast->next->next;
        if(slow==fast)
        {
            lsnode*meet=slow;//相遇节点
            while(head!=meet)
            {
                head=head->next;
                meet=meet->next;
            }
            return meet;
        }      
    }  
     return NULL;   
}

http://www.kler.cn/a/308765.html

相关文章:

  • MySQL重难点(一)索引
  • Fastapi使用MongoDB作为数据库
  • mongoDB的安装及使用
  • MySQL Workbench导入数据比mysql命令行慢
  • 嵌入式硬件杂谈(一)-推挽 开漏 高阻态 上拉电阻
  • ArcGIS Pro属性表乱码与字段名3个汉字解决方案大总结
  • C# net跨平台上位机开发(avalonia)附demo源码
  • 牛客背包问题练习 xinjun与阴阳师
  • 苍穹外卖学习笔记(八)
  • 【案例71】配置https之后 IE打不开登陆页面 Uclient没有问题
  • 《微信小程序实战(2) · 组件封装》
  • 【重学 MySQL】二十七、七种 join 连接
  • 宝塔Linux部署 Vue + Spring Boot + MySQL + Redis
  • Parallels Desktop 20 for Mac 正式发布,更新了哪些新功能(附下载链接)!
  • 深度学习驱动超材料设计领域发展
  • 用Inno Setup打包QT程序输出安装包
  • 消息队列的幂等问题解决方案
  • 51单片机+proteus+学习3(串口、矩阵按键)
  • 了解华为云容器引擎(Cloud Container Engine)
  • 关于http的206状态码和416状态码的意义、断点续传以及CORS使用Access-Control-Allow-Origin来允许跨域请求
  • 网络运维故障处理案例
  • 武汉传媒学院联合创龙教仪建设DSP教学实验箱,基于DSP C6000平台搭建
  • Pytorch详解-模型模块(RNN,CNN,FNN,LSTM,GRU,TCN,Transformer)
  • 了解云容器实例云容器实例(Cloud Container Instance)
  • JavaSE入门
  • 多线程同步