编程语言
首页 > 编程语言> > java数据结构与算法之链表找环入口

java数据结构与算法之链表找环入口

作者:互联网

java数据结构与算法之链表找环入口

方法一:使用hash表的方式

public static SingleNode hasCycle2(final SingleNode head) {
  if (head == null || head.next == null) {
   	return null;
  }
  final HashSet<SingleNode> hashSet = new HashSet<>();
  SingleNode current = head;
  while (current != null) {
     // 一边遍历链表一边判断该节点是否在set集合中,如果在则说明有环,并且该节点就是环的入口节点
     // 如果不在并且链表已经遍历完了,则说明没环
     if (hashSet.contains(current)) {
       return current;
     }
     hashSet.add(current);
     current = current.next;
  }
  return null;
}

方法二:使用快慢指针来解决

判断单链表是否有环:

如何找到入环节点呢?

public static SingleNode singleListFindCycleNode(final SingleNode head) {
        if (head == null || head.next == null) {
            return null;
        }
        // 两个指针同时从头开始走
        SingleNode fast = head;
        SingleNode slow = head;

        while (fast != null && fast.next != null) {
            // 慢指针一次走一步
            slow = slow.next;
            // 快指针一次走两步
            fast = fast.next.next;
            if (slow == fast) {
                break;
            }
        }

        if (fast == null || fast.next == null) {
            return null;
        }

        // 快指针从头开始重新走,直到他们相遇的节点就是环的入口节点(可自己证明)
        fast = head;
        while (fast != slow) {
            fast = fast.next;
            slow = slow.next;
        }
  			// 返回入环节点
        return fast;
    }

标签:head,java,fast,next,链表,找环,null,节点,指针
来源: https://blog.csdn.net/Hellowenpan/article/details/116654918