力扣 141.环形链表 给定一个链表,判断链表中是否有环。(Java)

题目描述

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。
如果链表中存在环,则返回 true 。 否则,返回 false 。

原题链接: 环形链表.

解题思路

一、哈希表

依次遍历整个链表,并创建一个哈希表来存储遍历过的节点,一直遍历到某节点的next节点为null,说明链表没有环,遍历结束。当要存入的节点,已经存在于哈希表中,说明链表有环,遍历结束。
该方法最易于想到,但需要额外的存储空间存遍历过的节点。

二、快慢指针

定义两个指针,一个慢指针,一个快指针,慢指针一次走一步,快指针一次走两步,若两个指针相遇了则有环,没有相遇则无环。初始时,慢指针指向head,快指针指向head->next。
当快指针的next节点为null或者快指针本身节点为null时,说明该链表没有环,遍历结束。如果链表有环,那么快慢指针一定会相遇(比如操场套圈,一定会在某个地方相遇),指向同一个节点,当指向同一个节点时,说明该链表有环,遍历结束。

/**
 * 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 p = head;
        ListNode q = head.next;
        //快慢指针不指向同一个元素
        //快指针不为空且快指针.next也不为空  对空进行操作会产生段错误,整个程序会崩溃
        while(p!=q && q!=null && q.next!=null){
            p = p.next;
            q = q.next.next;
        }
        //只有快慢指针相遇时说明有环,其他条件均无环(有指向null的)。
        return p==q;
    }
}

题目比较简单,但快慢指针的思想需掌握。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值