/** * Created by zhanghaipeng on 2019/8/6. * LeetCode 141 给定一个链表,判断链表中是否有环。 * 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。 * 示例 1: * 输入:head = [3,2,0,-4], pos = 1 * 输出:true * 解释:链表中有一个环,其尾部连接到第二个节点。 * <p> * 来源:力扣(LeetCode)141。 * 链接:https://leetcode-cn.com/problems/linked-list-cycle * 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 */ public class CircleList { public boolean hasCycle(ListNode head) { if (head == null || head.next == null) { return false; } // 快慢指针, 如果快慢指针再次碰撞说明有环 ListNode slow = head, fast = head; while (fast != null && fast.next != null){ // 先移动再比较是为了跳过head节点 slow = slow.next; fast = fast.next.next; if (fast == slow) { return true; } } return false; } } public boolean hasCycle2(ListNode head) { HashSet<ListNode> hashSet = new HashSet<>(); //返回值 boolean hasCycle = false; if(head == null || head.next == null){ return hasCycle; } //初始化 ListNode curNode = head.next; hashSet.add (head); hashSet.add (head.next); while(curNode.next != null){ ListNode checkNode= curNode.next; if(hashSet.contains (checkNode) == false) { hashSet.add (curNode); curNode = curNode.next; }else { hasCycle = true; return hasCycle; } } return hasCycle; }
public static void main(String[] args){ ListNode head = new ListNode (3); ListNode n1 = new ListNode (2); ListNode n2 = new ListNode (0); ListNode n3 = new ListNode (-4); head.next = n1; n1.next = n2; n2.next = n3; n3.next = n2; boolean hasCycle = new CircleList ().hasCycle (head); System.out.println (hasCycle ); } }
LeetCode 141 给定一个链表,判断链表中是否有环
最新推荐文章于 2024-04-14 12:50:32 发布