数据结构--链表刷题(一)快慢指针(下)

简介: 数据结构--链表刷题(一)快慢指针

数据结构--链表刷题(一)快慢指针(上)

https://developer.aliyun.com/article/1480781?spm=a2c6h.13148508.setting.14.5f4e4f0eUFaP8y

2.判断是否带环

https://leetcode.cn/problems/linked-list-cycle/description/

代码实现:

1.快慢指针

 
public class Solution {
    public boolean hasCycle(ListNode head) {
        if(head == null || head.next == null) return false;
 
        ListNode fast = head;
        ListNode slow = head;
 
        // 只要有环 则fast和slow一定会相遇
        while(fast != null && fast.next != null) {
            fast = fast.next.next;
            slow = slow.next;
 
            if(fast == slow) return true;
        }
 
        return false;
        
    }
}

2.使用哈希表

public class Solution {
    public boolean hasCycle(ListNode head) {
        Set<ListNode> seen = new HashSet<ListNode>();
        while(head != null) {
            if(!seen.add(head)) {
                return true;
            }
 
            head = head.next;
        }
 
        return false;
        
    }
}

2.环形链表的进阶

https://leetcode.cn/problems/linked-list-cycle-ii/submissions/

代码实现:

1.哈希表的实现
public class Solution {
    public ListNode detectCycle(ListNode head) {
        ListNode cur = head;
        Set<ListNode> seen = new HashSet<>();
 
        while(cur != null) {
            // 如果包含  则证明走到了入口点
            if(seen.contains(cur)) {
                return cur;
            }else {
                seen.add(cur);
            }
 
            cur = cur.next;
        }
 
        return null;
    }
}
 
2.双指针
public class Solution {
    public ListNode detectCycle(ListNode head) {
 
 
        // 先找相遇点
        ListNode fast = head;
        ListNode slow = head;
 
 
        while(fast != null && fast.next != null) {
            fast = fast.next.next;
            slow = slow.next;
 
 
            if(fast == slow) break;
        }
 
 
        // 跳出循环有两种condition
        if(fast == null || fast.next == null) return null;
 
 
        // fast = head  两个指针一起走 直到相同
        fast = head;
        while(fast != slow) {
            fast = fast.next;
            slow = slow.next;
        }
 
 
        return slow;
    }
}


目录
相关文章
|
程序员
【刷题记录】移除链表元素
【刷题记录】移除链表元素
173 0
|
索引 Python
【Leetcode刷题Python】328. 奇偶链表
在不使用额外空间的情况下,将链表中的奇数和偶数索引节点重新排序的方法,并提供了相应的Python实现代码。
266 0
|
Python
【Leetcode刷题Python】25.K 个一组翻转链表
解决LeetCode "K 个一组翻转链表" 问题的三种方法:使用栈、尾插法和虚拟节点顺序法,并提供了每种方法的Python实现代码。
412 0
链表指针的传参,传值和传地址
本文讨论了链表操作中指针传参的问题,特别是指针的传值与传地址的区别,并提供了修正代码,以确保链表插入操作能正确地修改指针指向的地址。
204 1
链表指针的传参,传值和传地址
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
462 4
|
算法 索引
单链表题+数组题(快慢指针和左右指针)
单链表题+数组题(快慢指针和左右指针)
220 1
|
Python
【Leetcode刷题Python】114. 二叉树展开为链表
LeetCode上114号问题"二叉树展开为链表"的Python实现,通过先序遍历二叉树并调整节点的左右指针,将二叉树转换为先序遍历顺序的单链表。
269 3
【Leetcode刷题Python】114. 二叉树展开为链表
|
Python
【Leetcode刷题Python】剑指 Offer 22. 链表中倒数第k个节点
Leetcode题目"剑指 Offer 22. 链表中倒数第k个节点"的Python解决方案,使用双指针法找到并返回链表中倒数第k个节点。
335 5
|
Python
【Leetcode刷题Python】剑指 Offer 18. 删除链表的节点
Leetcode题目"剑指 Offer 18. 删除链表的节点"的Python解决方案,通过使用双指针法找到并删除链表中值为特定数值的节点,然后返回更新后的链表头节点。
328 4
【刷题记录】链表的回文结构
【刷题记录】链表的回文结构
190 1