[剑指offer]链表中倒数第k个节点

[剑指offer]链表中倒数第k个节点

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

题目描述

输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。

示例:
给定一个链表: 1->2->3->4->5, 和 k = 2.
返回链表 4->5.

解题思路
  • 设链表的长度为N,倒数第K个位置,是正数第N-K+1个位置
  • 设置两个指针p、q,先让p移动K个节点,还有N-K个节点可以移动,此时让p、q同时移动,当p移动到链表尾时,q就从第1个节点移动了N-K个节点,到达了链表第N-K+1个位置,即倒数第K个位置了。
    [剑指offer]链表中倒数第k个节点_第1张图片
实现代码
class Solution {
public:
    ListNode* getKthFromEnd(ListNode* head, int k) {
        if(head==NULL)
            return NULL;
        if(k<1)
            return NULL;
        ListNode* p=head;
        ListNode* q=head;
        while(p!=NULL&k>0){
            p=p->next;
            k--;
        }
        if(k>0)
            return NULL;
        while(p!=NULL){
            p=p->next;
            q=q->next;
        }
        return q;
    }
};

你可能感兴趣的:(剑指offer)