此博客链接:https://www.cnblogs.com/ping2yingshi/p/12726126.html
1.环形链表(16min)
题目链接:https://leetcode-cn.com/problems/linked-list-cycle/submissions/
给定一个链表,判断链表中是否有环。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
示例 1:
输入:head = [3,2,0,-4], pos = 1 输出:true 解释:链表中有一个环,其尾部连接到第二个节点。
示例 2:
输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。
示例 3:
输入:head = [1], pos = -1
输出:false
解释:链表中没有环。
题解:
思路:
1.定义一个集合。
2.把节点加入到集合中并判断是否有相同的节点,有则说明有环。
3.节点不在集合中有两种情况:
1)链表还没有遍历完。
2)链表没有环。
代码如下:
public class Solution { public boolean hasCycle(ListNode head) { Set <ListNode> set=new HashSet<ListNode>(); ListNode pre =head; while(true) { if(pre==null) { return false; } else if(set.contains(pre)) return true; else { set.add(pre); pre=pre.next; } } } }
2.环形链表(12min)
题目链接:https://leetcode-cn.com/problems/linked-list-cycle-ii/
给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
说明:不允许修改给定的链表。
示例 1:
输入:head = [3,2,0,-4], pos = 1
输出:tail connects to node index 1
解释:链表中有一个环,其尾部连接到第二个节点。
示例 2:
输入:head = [1,2], pos = 0
输出:tail connects to node index 0
解释:链表中有一个环,其尾部连接到第一个节点。
示例 3:
输入:head = [1], pos = -1
输出:no cycle
解释:链表中没有环。
题解:
思路:此题和上面思路一样,唯一不同的是返回值不同,上题是判断是否有环,返回true和false,而这道题是当有环时,返回链表下标。有环时,这里直接返回节点即为链表下标。
public class Solution { public ListNode detectCycle(ListNode head) { Set <ListNode> set=new HashSet<ListNode>(); ListNode pre =head; while(true) { if(pre==null) { return null; } else if(set.contains(pre)) return pre; else { set.add(pre); pre=pre.next; } } } }