在计算机领域,算法是一个永恒的主题。任何计算机使用者都希望计算机能运行得更快一些或是能解决更大规模的问题。从现在开始,跟随我每天刷一道算法题吧!


在此之前,我们刷的几乎都是有关数组操作的算法题。在接下来的几天里,我们将学习 “双指针技巧”,它可以帮助我们解决许多与数组相关的问题。

双指针专题 第七天。

LeetCode #141 环形链表

题目

给定一个链表,判断链表中是否有环。

为了表示给定链表中的环,我们使用整数 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
解释:链表中没有环。


解题思路

思路 :

这次既不是数组也不是字符串,这次将接触一下链表这种数据类型。对于链表,因为我们只能在一个方向上遍历链表。所以左右双指针在链表中无法工作,然而,快慢指针技巧,是非常有用的。

我们需要一个慢指针和快指针对链表进行遍历。在一条有尽头的链表中,快指针始终会首先到达链表尽头;而当在一条循环无尽头的链表中,快指针会不停绕圈,始终会与慢指针相遇。

双指针代码:

/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public boolean hasCycle(ListNode head) {
if (head == null) return false;

ListNode slow = head;
ListNode fast = head.next;

while(slow != fast){
if (fast == null || fast.next == null){
return false;
}
slow = slow.next;
fast = fast.next.next;
}

return true;
}
}

评论