1.题目
输入一个链表,输出该链表中倒数第k个结点。
2.我的题解
(1)设置两个指针,称为快慢指针,快指针指向链表头,慢指针指向NULL
。
(2)快指针先走k
步,然后将慢指针赋值为链表头,之后与快指针一起走。
(3)快指针到达NULL
时,慢指针指向的节点即为要求结果。
以k=4,List={1,2,3,4,5}
为例。
k | 状态 |
---|---|
4 | |
3 | |
2 | |
1 | |
0 | |
\ |
/*
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(k==0)return NULL;
ListNode * cur=pListHead;
ListNode * res=NULL;
int cnt = k;
while(cur){
cur=cur->next;
cnt--;
if(cnt==0)res=pListHead;
else if(cnt<0) res=res->next;
}
return res;
}
};
3.别人的题解
本题需要注意的问题有:
k<=0
应该返回NULL
k>len(List)
应该返回NULL
- 快指针比慢指针早出发
k
步,直到快指针为NULL
- 快指针比慢指针早出发
k-1
步,直到快指针的下一个节点为NULL
我的思路是慢指针比快指针慢出发k步,反过来想,快指针要先出发k步。
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
ListNode * fast=pListHead;
for(int i=0;i<k;i++){
if(!fast)return NULL;
fast=fast->next;
}
while(fast){
fast=fast->next;
pListHead=pListHead->next;
}
return pListHead;
}
};
4.总结与反思
(1)快慢指针,注意边界。
(2)有指定大小的数时,for
循环较while
循环一般更容易理解。