美文网首页
检测链表中的循环

检测链表中的循环

作者: 西三旗靓仔 | 来源:发表于2020-01-18 16:54 被阅读0次

给定一个链表,检查链表是否有循环。下图显示了带有循环的链表。

image

解题思路

使用快慢两个指针遍历链表。
将慢指针(slow_p)一次移动一个节点,另快指针(fast_p)移动两个。 如果这些指针在同一节点相遇,则存在循环。如果指针不符合,则链接列表没有循环。

image.png

原理分析

1)当慢指针进入循环时,快指针已在循环内部。令快指针与慢指针的距离为k。

2)现在,如果考虑慢慢指针的移动,我们可以注意到它们之间的距离在每次迭代后增加一。经过一个迭代(慢指针=慢指针的下一个节点,快指针=快指针的下一个节点),快慢指针的距离变为k + 1,经过两次迭代为k + 2,依此类推。当距离变为环的长度n时,它们将会合,因为它们在长度为n的环中运动。

例如,我们可以在下图中看到,初始距离为2。经过1次迭代,距离变为3,经过2次迭代,距离变为4。经过3次迭代,它变为距离0的5。它们相遇。


代码实现

// Java代码检测list是否成环 
class LinkedList { 
   Node head; // head of list 
 
   /* Linked list 节点*/
   class Node { 
       int data; 
       Node next; 
       Node(int d) 
       { 
           data = d; 
           next = null; 
       } 
   } 
 
   /* 添加新节点至链表头 */
   public void push(int new_data) 
   { 
       /* 1 & 2: 分配节点空间 & 
                 设置数据*/
       Node new_node = new Node(new_data); 
 
       /* 3. 将新节点的next指向head节点 */
       new_node.next = head; 
 
       /* 4. head指向新节点 */
       head = new_node; 
   } 
 
   int detectLoop() 
   { 
       Node slow_p = head, fast_p = head; 
       while (slow_p != null && fast_p != null && fast_p.next != null) { 
           slow_p = slow_p.next; 
           fast_p = fast_p.next.next; 
           if (slow_p == fast_p) { 
               System.out.println("Found loop"); 
               return 1; 
           } 
       } 
       return 0; 
   } 
 
   /* 测试驱动程序 */
   public static void main(String args[]) 
   { 
       LinkedList llist = new LinkedList(); 
 
       llist.push(20); 
       llist.push(4); 
       llist.push(15); 
       llist.push(10); 
 
       /*Create loop for testing */
       llist.head.next.next.next.next = llist.head; 
 
       llist.detectLoop(); 
   } 
} 

输出:

Found Loop

时间复杂度:O(n)
空间复杂度:O(1)

相关文章

  • 检测链表中的循环

    给定一个链表,检查链表是否有循环。下图显示了带有循环的链表。 解题思路 使用快慢两个指针遍历链表。将慢指针(slo...

  • 正面刚算法-检测链中是否有环

    检测链表中是否存在环 通俗的讲检测链中的环就是看这个链表的遍历是否进入到一个环中,如果进入到环中,则会出现死循环,...

  • 单链表循环检测

    单链表中的循环如果链表带循环,从表头开始遍历,最终一定会进入链表循环中使得遍历过程无法适当停止。 两质点在同一圆周...

  • Java常用类库与技巧-集合

    一 数据结构常见问题 数组和链表的区别;链表的操作,如反转,链表环路检测,双向链表,循环链表相关操作;队列,栈的应...

  • 2.两数相加

    数字以链表的方式逆序存储,要求计算两数之和并放置于链表中。 思路:利用while循环,检测两数是否为空,当非空的时...

  • 双向链表

    双向链表的结构 既然单链表有循环链表,双向链表当然也有双向循环链表,如下图: 问: 双向链表中某个节点p的后继节点...

  • # 数据结构之循环链表(四)

    在上一篇博客中,我讲了有关于单循环链表的一些基本操作。在这篇博客中,我来讲述一下双向链表和双向循环链表。 循环链表...

  • 算法面试:链表环的检测

    在有关链表的面试算法题中,检测链表是否有环是常见的题目。 给定一个链表,要求你判断链表是否存在循环,如果有,给出环...

  • 三、数据结构与算法 — 链表

    链表与数组的区别 链表不是连续的 单链表与循环链表 注意链表中的头结点和尾结点。 循环链表从尾可以方便的到头,适合...

  • 数据结构与算法之循环链表(3.4)

    目录 单向循环链表双向循环链表约瑟夫问题如何发挥循环链表的最大威力? 一 单向循环链表 单向循环链表 - 只有一个...

网友评论

      本文标题:检测链表中的循环

      本文链接:https://www.haomeiwen.com/subject/qznkzctx.html