链表的倒数第k个节点
文章目录
题目
输入一个链表,输出该链表中倒数第k个结点。 最后一个为倒数第1个。
思路
遍历一遍得到链表长度,再遍历一遍得到倒数第几个,复杂度为
只遍历一遍的方法为 ,维持两个指针,两个指针 差为 K-1
然后同时往前走,第一个走到尾,第二个正好就是倒数第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) {
//双指针,一前一后,中间隔k-2个节点
if(pListHead == NULL)
return NULL;
ListNode* pa = pListHead;
ListNode* pb = pa;
for(int i=0; i<k-1; i++)//注意倒数第0个!
{
if(pb->next==NULL)
return NULL;
pb = pb->next;
}
while(pb->next!=NULL)
{
pa = pa->next;
pb = pb->next;
}
return pa;
}
};
/*
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==nullptr || k<=0)
return nullptr;
ListNode* p1 = pListHead;
ListNode* p2 = pListHead;
while(--k)
{
if(p1->next!=nullptr)
p1 = p1->next;
else
return nullptr;
}
while(true)
{
if(p1->next==nullptr)
break;
p1 = p1->next;
p2 = p2->next;
}
return p2;
}
};