题目描述

输入一个链表,输出该链表中倒数第k个结点。链表可能为空k可能等于0

思路

利用快慢指针写法,两个指针都指向头结点,一个指针先走k-1个节点,然后两个指针一起走,直到一个指针到达尾部。时间复杂度$O(n)$,一次遍历。

#include<bits/stdc++.h>
using namespace std;
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
            val(x), next(NULL) {
    }
};
class Solution {
public:
    ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
        if(pListHead==NULL||k==0)return NULL;
        ListNode *findk=pListHead;
        while(k--){
            pListHead=pListHead->next;
            if(pListHead==NULL&&k==0)return findk;
            else if(pListHead==NULL) return NULL;
        }
        while(pListHead!=NULL){
            findk=findk->next;
            pListHead=pListHead->next;
        }
        return findk;
    }
};
int main(){
    Solution ac;
    ListNode head(1);
    ListNode *root=&head;
    for(int i=2;i<=10;++i){
        root->next=new ListNode(i);
        root=root->next;
    }
    root=&head;
    cout<<ac.FindKthToTail(root,10)->val<<endl;
    return 0;
}
Last modification:August 19th, 2020 at 03:55 pm