题解 | #链表中倒数最后k个结点#

链表中倒数最后k个结点

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

以下方法还是自己在纸上画一画,while 、 for出来的指针的位置。

方法一:这其实是一个数学题,返回倒数k个节点。那么总长度为n,个人感觉最直观的方法就是指针p先走n-k步,这个时候p指针指向的就是倒数第k个节点。然后直接返回p即可。

public:
    ListNode* FindKthToTail(ListNode* pHead, int k) {
        // write code here
        int n = 0;
        //输入k不合法,直接返回
        if(k <= 0) return nullptr;
        ListNode* p = pHead;
        while(p){
            p = p->next;
            n++;
        }
        //长度小于k。返回
        if(n < k) return nullptr;
        p = pHead;
        for(int i = 0; i < n - k; i++){
            p = p->next;
        }
        return p;
    }
};

方法二:双指针,先让指针p_fisrt从phead开始走k步,然后让指针p_second从pHead开始走。最后当p_first遍历完整个链表,那么p_second就是指向倒数第k个节点

public:
    ListNode* FindKthToTail(ListNode* pHead, int k) {
        // write code here
        int n = 0;
        ListNode* p_first = pHead;
        ListNode* p_second = pHead;
        //这里先用p_first计算一下长度
        while(p_first){
            p_first = p_first->next;
            n++;
        }
        if(n < k) return nullptr;
        if(k <= 0) return nullptr;
        p_first = pHead;
        //先让p_first走k步
        for(int i = 0; i < k; i++){
            p_first = p_first->next;
        }
        while(p_first){
            p_first = p_first->next;
            p_second = p_second->next;
        }
        return p_second;
    }
};

方法三:可以用栈的思想。先将整个链表入栈,然后再出栈k个节点,对出栈的每个节点链接到它的上一个节点,。

public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param pHead ListNode类 
     * @param k int整型 
     * @return ListNode类
     */
    ListNode* FindKthToTail(ListNode* pHead, int k) {
        // write code here
        int n = 0;
        stack<ListNode*> s;
        ListNode* p = pHead;
        while(p){
            s.push(p);
            p = p->next;
            n++;
        }
        
        if(n < k) return nullptr;
        if(k <= 0) return nullptr;
        
        ListNode* pre = nullptr;
        for(int i = 0; i < k; i++){
            ListNode* cur = s.top();
            s.pop();
            cur->next = pre;
            pre = cur;
        }
        return pre;
    }
};

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-11 15:08
点赞 评论 收藏
分享
每晚夜里独自颤抖:要求太多的没必要理
点赞 评论 收藏
分享
07-11 11:10
门头沟学院 Java
请问各位大三兄弟们跟hr说多久实习时间到时候可以提前跑路吗?
程序员小白条:问就是六个月以上,可以一年,实习都这样,你入职后想跑就跑
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务