题目:输入一个链表,输出该链表中倒数第k个节点。从1开始计数,如链表有1,2,3,4,5,6.倒数第三个节点是值为4的节点。
可以采用两个指针,思路比较清晰,但是就是一些边界条件很难考虑全,比如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) {
if(pListHead==NULL)
return NULL;
ListNode* fast=pListHead;
ListNode* slow=pListHead;
int num=1;
while(fast!=NULL&&num<=k)
{
fast=fast->next;
num++;
}
if(fast==NULL&&num<=k)
return NULL;
while(fast!=NULL)
{
fast=fast->next;
slow=slow->next;
}
return slow;
}
}; 看了下书上的解答,代码思路清晰,如下:
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* fast=pListHead;
ListNode* slow=pListHead;
for(unsigned int i=0;i<k-1;i++)
{
if(fast->next!=NULL)
fast=fast->next;
else
return NULL;
}
while(fast->next!=NULL)
{
fast=fast->next;
slow=slow->next;
}
return slow;
}
};
本文介绍了一种利用双指针法寻找链表中倒数第K个节点的方法。通过设置快慢两个指针,先让快指针前进K步,再同时移动两指针直至快指针到达链表尾部,此时慢指针所指即为所求节点。讨论了特殊情况处理,如K超出链表长度的情况。
520

被折叠的 条评论
为什么被折叠?



