算法7(力扣141)-循环链表

张春  论坛元老 | 2025-1-23 15:04:10 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1029|帖子 1029|积分 3087

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1、问题

         给你一个链表的头节点 head ,判断链表中是否有环。
        如果链表中有某个节点,可以通过一连跟踪 next 指针再次到达,则链表中存在环。 为了体现给定链表中的环,评测系统内部利用整数 pos 来体现链表尾连接到链表中的位置(索引从 0 开始)。留意:pos 不作为参数进行通报
        仅仅是为了标识链表的实际环境。
        如果链表中存在环 ,则返回 true 。 否则,返回 false
2、采用例子

        输入:head = [3,2,0,-4], pos = 1
        输出:true
        解释:链表中有一个环,其尾部连接到第二个节点。
3、实现思路

        先创建循环链表
4、具体步骤

(1)定义链表结构(由于此次需要利用数组创建链表,以是定义链表结构需要给next一个默认值null)

        

(2)创建循环链表

实现思路:找到开始循环的节点,将链表循环的最后一位指向开始循环的节点
       

        1)通过通报数组长度是否为空,判断链表是否为空链表,空链表直接返回

        

        2)定义链表头结点、当前节点和开始循环的节点

        


        3)通过循环遍历赋值,同时探求开始循环的节点(给的有开始循环的位置pos)

        


        4)循环结束后,让链表的最后一个循环点指向开始循环的点



        5)打印并返回链表

        


(3)检查是否有循环

        通过快慢指针,当快指针追上慢指针时,即存在循环

        1)判断是否是空链表,空链表返回

        


        2)进入函数,定义快慢指针,判断是否有循环,存在返回true

        


        3)函数结束,无循环返回false

        


5、完整代码

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>环形链表</title>
  7. </head>
  8. <body>
  9.     <p>
  10.         给你一个链表的头节点 head ,判断链表中是否有环。
  11.         如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递
  12.         。仅仅是为了标识链表的实际情况。
  13.         如果链表中存在环 ,则返回 true 。 否则,返回 false
  14.     </p>
  15.     <p>
  16.         输入:head = [3,2,0,-4], pos = 1
  17.         输出:true
  18.         解释:链表中有一个环,其尾部连接到第二个节点。
  19.     </p>
  20.     <script>
  21.         class ListNode{
  22.             constructor(val,next=null){
  23.                 this.val = val
  24.                 this.next = next
  25.             }
  26.         }
  27.         let arr = [3, 2, 0, -4]
  28.         let pos = 1
  29.         let head = cycleList(arr,pos)
  30.         hasCycle(head)
  31.         // 怎么创建一个环形链表
  32.         function cycleList(arr,cycleStartIndex){
  33.             // 空数组,即链表为空
  34.             if (arr.length===0) {
  35.                 return null
  36.             }
  37.             // 头结点
  38.             let head = new ListNode(arr[0])
  39.             // 当前节点
  40.             let cur = head
  41.             // 开始循环的节点
  42.             let cycleNode = null
  43.             for (let i = 1; i < arr.length; i++) {
  44.                 // 利用数组的值创建节点,赋值给当前节点
  45.                 cur.next = new ListNode(arr[i])
  46.                 // 指针后移
  47.                 cur = cur.next
  48.                 // 判断循环点,是循环点,将当前节点赋值给循环点作为标记,方便后续构建闭环
  49.                 if(i === cycleStartIndex){
  50.                     cycleNode = cur
  51.                 }
  52.             }
  53.             // 让循环结束时当前节点的下一位指向循环点,构成闭环
  54.             cur.next = cycleNode
  55.             console.log(head);
  56.             
  57.             // 返回链表
  58.             return head
  59.         }
  60.         function hasCycle(head){
  61.             // 空链表
  62.             if (!head)return false;
  63.             // 使用快慢指针,当快指针和慢指针指向同一节点时存在环
  64.             let slow = head
  65.             let fast = head
  66.             while(fast&&fast.next){
  67.                 fast = fast.next.next
  68.                 slow = slow.next
  69.                 if(fast == slow){
  70.                     console.log(true);
  71.                     
  72.                     return true
  73.                 }
  74.             }
  75.             console.log(false);
  76.             
  77.             return false
  78.         }
  79.     </script>
  80. </body>
  81. </html>
复制代码
6、力扣通过代码

  1. var hasCycle = function(head) {
  2.       // 空链表
  3.             if (!head)return false;
  4.             // 使用快慢指针,当快指针和慢指针指向同一节点时存在环
  5.             let slow = head
  6.             let fast = head
  7.             while(fast&&fast.next){
  8.                 fast = fast.next.next
  9.                 slow = slow.next
  10.                 if(fast == slow){
  11.                     console.log(true);
  12.                     
  13.                     return true
  14.                 }
  15.             }
  16.             console.log(false);
  17.             
  18.             return false
  19. };
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

张春

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表