题目地址:https://leetcode-cn.com/problems/linked-list-cycle/
题目:
给定一个链表,判断链表中是否有环。
进阶:你能否不使用额外空间解决此题?
试题分析:
查看链表是否有环主要有两个方法比较,
一种是利用set数据结构,set是一种不会有重复数据的集合结构,遍历链表,将链表的节点依次放入set中,如果遍历的节点在set中还没有则add到set中,如果已经存在则说明链表有重复节点有环。
还有一种方法是比较特殊的算法,快慢指针法,这种算法比较诡异,一般人不容易想到,核心思路就是定义两个指针,一个快指针、一个慢指针,慢指针每次只移动一个节点,快指针每次移动两个节点,如果整个链表中有环,那么快慢指针一定会相遇,不相信的话,可以自己在草稿纸上分步画下就会发现如果有环一定会相遇。
代码:
<pre class="md-fences md-end-block" lang="java" contenteditable="false" cid="n89" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Consolas, "Liberation Mono", Courier, monospace; font-size: 0.9em; white-space: pre; text-align: left; break-inside: avoid; display: block; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(221, 221, 221); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; padding: 8px 1em 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; caret-color: rgb(51, 51, 51); color: rgb(51, 51, 51); font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; text-decoration: none; background-position: inherit inherit; background-repeat: inherit inherit;"> public boolean hasCycle(ListNode head) {
HashSet<ListNode> set = new HashSet<ListNode>();
while(head!=null){
if(set.contains(head)){
return true;
}else{
set.add(head);
head = head.next;
}
}
return false;
}
public boolean hasCycle2(ListNode head) {
//快慢指针方法,快指针比慢指针每次快两倍
ListNode slow =head;
ListNode fast = head;
while(slow!=null && fast!=null && fast.next!=null){
slow = slow.next;
fast = fast.next.next;
if(slow==fast){
return true;
}
}
return false;
}</pre>
源码路径:com.monkey01.linkedlist.LinkedListCycle_141
配套测试代码路径:test目录com.monkey01.linkedlist.LinkedListCycle_141Test