链表中倒数最后k个结点【Java版】

链表中倒数最后k个结点

http://www.nowcoder.com/practice/886370fe658f41b498d40fb34ae76ff9

1)标准的 双指针法

public class Solution {
    public ListNode FindKthToTail (ListNode pHead, int k) {
        ListNode pre = pHead;//head是第一个节点
        ListNode res = pHead;
        while(--k >= 0){
            if(pre== null)return null;//倒数第k的k值大于链表总长度
            pre=pre.next;
        }
        while(pre!=null){
            pre=pre.next;
            res=res.next;
        }
        return res;
    }
}
//时间 O(N)
//空间 O(1)

2)朴素方法(可读性好,且性能相当)

public class Solution {
    public ListNode FindKthToTail (ListNode pHead, int k) {
        int len =0;
        ListNode p = pHead;
        while(p != null){
            p = p.next;
            ++len;
        }
        if(len<k)return null;
        p = pHead;
        for(int i=1; i<=len-k; ++i){
            p=p.next;
        }
        return p;
    }
}
//【个人认为】前后指针的方法,其实和朴素的方法没有实质的性能差别。==>感觉只能炫技而已,华而不实
//时间上:两种方法的遍历都是 一个指针完整遍历N跳,另一个/另一次遍历N-k跳;
//空间上:朴素方法只要一个节点指针,前后节点法占用两个节点指针;
//总的来说,就是【一个指针遍历两次,和两个指针遍历一次】这样子,性能上,并没有两倍的时间差别
《剑指Offer-Java题解》 文章被收录于专栏

《剑指Offer-Java题解》

全部评论

相关推荐

头像
05-22 20:17
点赞 评论 收藏
转发
投递美团等公司9个岗位
点赞 评论 收藏
转发
1 收藏 评论
分享
牛客网
牛客企业服务