问题描述:
以上述链表为例,需要返回作为环状链表开始的节点2的索引:
输入:head = [3,2,0,-4], pos = 1 输出:返回索引为 1 的链表节点
此问题也可以用哈希表存储的方法来做,边存一个节点在哈希表中,边进行判断此节点是否在哈希表中出现过
而此题可以用双指针来解决,原理如下:
定义一个快指针,一个慢指针:
ListNode slow = head, fast = head;
对于一个环状链表而言,就拿问题描述中的链表来说,其遍历顺序为:
3->2->0->-4->2->0->-4->2->........
所以如果让快指针每两个节点进行移动,而慢指针则进行顺序依次遍历,由于链表到最后就是几个节点重复的循环,所以始终会有一个时候,慢指针会和快指针指向同一个节点。
将以上想法进行代码实现:
ListNode slow = head, fast = head;
while (fast != null) {
slow = slow.next;
if (fast.next != null) {
fast = fast.next.next;
} else {
return null;
}
if (fast == slow) {
return fast;
}
}
return null;