题目描述
输入一个链表,输出该链表中倒数第k个结点。
思路:利用尺子原理,设置两个快慢指针,快得指针先走k-1步子,然后快慢指针同时走,快指针到头时,慢指针指向倒数k个元素。
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindKthToTail(ListNode* head, unsigned int k) {
if(head==nullptr||k<=0)
return nullptr;
ListNode* slow=head;
ListNode* fast=head;
for(int i=1;i<k;i++){
if(fast->next==nullptr){
return nullptr;
}
fast=fast->next;
}
while(fast->next!=nullptr){
fast=fast->next;
slow=slow->next;
}
return slow;
}
};
大佬的写法:
class Solution {
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
auto pre = pListHead, ret = pre;
for (int i = 0; i < k - 1 && pre != nullptr; ++i, pre = pre->next);
if (pre == nullptr)
return nullptr;
for (; pre->next != nullptr; ret = ret->next, pre = pre->next);
return ret;
}
};
更加展现编程功底的做法:
class Solution {
public:
ListNode* FindKthToTail(ListNode* head, unsigned int k) {
ListNode* p;
ListNode* q;
p=q=head;
int i=0;
for(;p!=nullptr;i++){
if(i>=k)
q=q->next;//大于K的时候同时移动
p=p->next;
}
return i<k?nullptr:q;
}
};