栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

LeetCode876 --- 剑指Offer 22

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

LeetCode876 --- 剑指Offer 22

题目描述:LeetCode876


非空链表,我们不需要判断为空的条件。

思路:

需要得到链表的中间节点,也许会想到,将链表遍历一遍,求出长度,再遍历一遍得到中间节点。如果只能遍历一遍呢?中间节点,也就是链表长的二分之一,那就可以通过定义两个指向,都从head开始向后遍历。fast一次向后挪两个节点,slow一次向后挪动一个节点。当fast为null或者fast.next为null,代表着fast已经走到终点,而此时的slow恰好就遍历了一半链表,此时slow就处于中间节点的位置。

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

        while( fast!=null && fast.next!=null){
            fast=fast.next.next;
            slow=slow.next;
        }
        return slow;
    }
}
题目描述:剑指Offer22

思路:

几乎和上面一致,不过此时的slow和fast起点不同,因为当fast到重点时,slow要比fast少k-1步。fast和slow每次都走一步,因为它们的距离差已经确定,所以速读要一致。

代码:
class Solution {
    public ListNode getKthFromEnd(ListNode head, int k) {

        if(head==null){
            return null;
        }

        ListNode fast=head;
        ListNode slow=head;

        while(k-1>0){
            if(fast==null || fast.next==null){
                return null;
            }
            fast=fast.next;
            k--;
        }

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

        return slow;

    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/769185.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号