3.<tag-链表和快慢针>lt.876-链表的中间结点 + lt.141-环形链表 + lt.142-环形链表 II 2 + 针对环形链表的面试扩展 2.8

本文解析了如何在链表中找到中间节点,以及使用快慢针、哈希表和标记法检测环形链表及其入口。涉及多种方法,如朴素遍历、快慢针法和递归,同时讨论了环形链表的常见问题和解决方案。

lt.876-链表的中间结点

[案例需求]
在这里插入图片描述

[思路分析]

在这里插入图片描述

[代码示例一, 朴素写法]

class Solution {
   
   
    public ListNode middleNode(ListNode head) {
   
   
        //遍历结点, 得到链表的个数 count, 再次遍历链表 返回地 count/2 + 1 个结点;
        int count = 0;
        ListNode temp = head;

        while(temp != null){
   
   
            count++;
            temp = temp.next;
        }

        //遍历count/2 + 1 次
        temp = head;

        for(int i = 1; i < count / 2 + 1; i++){
   
   
            temp = temp.next;
        }

        return temp;
    }
}

[代码示例二, 快慢针法]

class Solution {
   
   
    public ListNode middleNode(ListNode head) {
   
   
 
        ListNode fast = head;
        ListNode slow = head;

        while(fast != null && fast.next != null){
   
   
            slow = slow.next;
            fast = fast.next.next;
        }

        return slow;
    }
}

[思路分析三, 递归法]

class Solution {
   
   
    int res = 0;
    int count = 0;
    public ListNode middleNode(ListNode head) {
   
   
        //1. 两次遍历
        //2. 栈
        //3. 快慢针
        if (head == null) return null;
        count++;
        ListNode node = middleNode(head.next);
        if (node == null) {
   
   
            res++;
            if (res == (count % 2 == 1 ? count / 2 +
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值