问题描述
输入一个链表,输出该链表中倒数第k个结点。
思路
直接计算链表结点总个数count,然后从前向后找第 count-k+1 个节点
class Solution {
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
int count=0;
ListNode* kNode=pListHead;
while(pListHead){
count++;
pListHead=pListHead->next;
}
if(count<k){
return NULL;
}
for(int i=1;i<=count-k;i++){
kNode=kNode->next;
}
return kNode;
}
};
使用栈
class Solution {
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
stack<ListNode*> s;
while(pListHead){
s.push(pListHead);
pListHead=pListHead->next;
}
if(k>s.size()){
return NULL;
}
if(k==0){
return NULL;
}
while(k>1){
s.pop();
k--;
}
return s.top();
}
};
使用vector容器
class Solution {
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
vector<ListNode*> v;
while(pListHead){
v.push_back(pListHead);
pListHead=pListHead->next;
}
int len;
len=v.size();
if(k>len){
return NULL;
}
if(k==0){
return NULL;
}
return v[len-k];
}
};
维护两个指针
定义一个快指针一个慢指针,快指针走了k步后慢指针开始走,这样慢指针要走链表总长-k步,其下一个节点就正好是倒数第k个结点
class Solution {
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
ListNode* fast;
ListNode* slow;
fast=pListHead;
slow=pListHead;
int i=0;
while(fast){
if(i>=k){
slow=slow->next;
}
fast=fast->next;
i++;
}
if(i<k){
return NULL;
}
return slow;
}
};