链表中倒数第k个节点
输入一个链表,输出该链表中倒数第k个节点。
题解:
本体想要输出倒数第k个节点,对于单链表而言,在不知道链表长度的情况下,要输出倒数第k个节点,有两种方法:
1)遍历长度查找:
利用第一次遍历,查找单链表长度length,就是顺数第length-i+1个节点。
代码如下
/*
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)||k==0)
return nullptr;
ListNode *p;
p=pListHead;
int length=0;
while(p){
length++;
p=p->next;
}
if(length<k)
return nullptr;
p=pListHead;
for(unsigned int i=0;i<length-k;i++){
p=p->next;
}
return p;
}
};
2)双指针法:
对于双指针而言,我们可以定义两个指针,第一个快指针先走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) {
if(!pListHead||k==0)
return nullptr;
ListNode *p,*q;
p=pListHead;
for(unsigned int i=0;i<k;i++){
if(!p)
return nullptr;
p=p->next;
}
q=pListHead;
while(p){
p=p->next;
q=q->next;
}
return q;
}
};