题目:有一个单向链表, 链表中有可能出现”环”, 就像下图这样.那么, 如何用程序来判断该链表是否为有环链表呢?

image-20210425205713779.png
2.思路扩展:
环形跑道追及问题: 男生和女生从同一起点起跑, 直到两人再次相遇
image-20210426193707844.png
3.解法:
定义两个指针p1, p2, p1每次移动1个单位, p2每次移动2个单位, 并且同时从头节点出发, 如果p1和p2再次相遇, 则证明链表有环, 反之无环.

4.代码:

  1. package com.xiaoxuanfeng.letcode;
  2. public class TheRingOfLinkedList {
  3. // 1.定义节点
  4. private static class Node {
  5. int data; // 当前节点的值
  6. Node next; // 指向下一节点
  7. Node(int data) {
  8. this.data = data;
  9. }
  10. }
  11. // 2.判断是否有环
  12. public static boolean isCycle(Node head) {
  13. // 定义p1,, p2, 让它们从head同时出发
  14. Node p1 = head;
  15. Node p2 = head;
  16. while (p2 != null && p2.next !=null) {
  17. p1 = p1.next; // p1移动1个单位
  18. p2 = p2.next.next; // p2移动2个单位
  19. if (p1 == p2) {
  20. return true;
  21. }
  22. }
  23. return false;
  24. }
  25. // 3.调用主函数进行测试
  26. public static void main(String[] args) {
  27. // 创建链表
  28. Node node1 = new Node(1);
  29. Node node2 = new Node(2);
  30. Node node3 = new Node(3);
  31. Node node4 = new Node(4);
  32. // 把节点连走来
  33. node1.next = node2;
  34. node2.next = node3;
  35. node3.next = node4;
  36. node4.next = null;
  37. // 打印结果
  38. System.out.println(isCycle(node1));
  39. }
  40. }