您的位置:首页 > Web前端

剑指offer-链表中倒数第k个结点

2018-03-31 16:42 351 查看
求链表的倒数第K个节点:主要思路设置两个指针,刚开始都指向链表的第一个节点,第一个指针先走k-1步,然后两个一块走,直到第一个指针的下一位为nullptr,则第二个指针所指的位置就是倒数第k个节点。  在编程书上看见这个方法,自己画了个链表试了试果然是这样,但是这是个什么原理呢?  想了想是这样的耶。。。分为两种情况:1、倒数第k个位置在正数第k个位置之后,如图:  

    此种情况下:P_head和nullptr分别表示链表的头位置和末位置,+k表示正数第K个位置,-K表示倒数第K个位置,first指针代表已经走了K-1个位置之后的第一个指针位置,second表示第二个指针从起始位置开始。    然后first和second一块开始走,直到first->next指向nullptr,即first_end的位置,此时second走到second_end,second_end即是倒数第k个位置。first和second走过的长度都是蓝色区域加黄色区域的长度。      2、倒数第K个位置在正数第K个位置之前,如图:      

    此种情况下:P_head和nullptr分别表示链表的头位置和末位置,+k表示正数第K个位置,-K表示倒数第K个位置,first指针代表已经走了K-1个位置之后的第一个指针位置,second表示第二个指针从起始位置开始。     然后first和second一块开始走,直到first->next指向nullptr,即first_end的位置,此时second走到 second_end,second_end即是倒数第k个位置。first和second走过的长度都是黄色区域的长度。 其实还有第三种情况:就是比较特殊的-k=+k的情况,即倒数第k个位置就是正数第k个位置(中间位置),但这种情况可以归类为以上两种情况的任意一种,不做特殊处理。 故可以简单的写出代码:注意事项:1、要是K大于链表长度怎么办?     2、k<=0怎么办?
/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode FindKthToTail(ListNode head,int k) {
        if(head==null)
            return null;
        ListNode p1=head;
        ListNode p2=head;
        int dump = k-1;
        while(dump!=0){
            p1 = p1.next;
            if(p1==null)
                return null;
            dump--;
        }
        while(p1.next!=null){
            p1 = p1.next;
            p2 = p2.next;
        }
        return p2;
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: