双指针
双指针是应用于链表的一种常见套路,这个套路上课是不会教的。
何为双指针?两个指针都指向链表头,一个指针pointer1一次走一步,另一个指针pointer2一次走两步,这就叫双指针。
这个可能听起来很简单,甚至有点懵逼:这玩意有什么用?且听我慢慢道来。
面试题1:判断链表是否有环
如图,这就是一个带环的链表,即2->0->-4会无限循环
那么如何判断一个链表是否有环?
思路
这篇文章讲的是双指针,那当然是利用双指针啦!
你试想一下,在一个环形跑道上,两个人以不同速度出发跑无数圈,那么除了起点以外,是不是两人会在某处相遇?
判断链表是否有环也是一样的,两个指针(两个速度不同的人)分别以1步、2步的速度前进,如果有环,两者必将在某次前进后相等(两人相遇)。
不同速的人终会在环内相遇
Java代码
boolean ifHasCycle(LinkedList list) {
// 两个指针指向链表头部
LinkedListNode pointer1 = list.head;
LinkedListNode pointer2 = list.head;
// 双指针开始跑步!
while (pointer1 != null && pointer2 != null) {
// 前进1步
pointer1 = pointer1.next;
// 前进2步
point