题目
输入一个链表,输出该链表中倒数第k个结点。
方法一
先遍历链表,计算出链表的长度len后,计算出倒数第k个结点为第len-k+1个结点。
class Solution {
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
ListNode *p=pListHead;
ListNode *pre=pListHead;
int len=0,med;
if(pListHead==NULL || k==0)
return NULL;
while(p!=NULL){
len++;
p=p->next;
}
if(k>len)
return NULL;
else{
med=len-k;
while(med>0){
pre=pre->next;
med--;
}
return pre;
}
}
};
方法二
设置两个指针pre,p,pre先走k-1步后,p再开始走,等到pre指向最后一个结点,此时p指向的是该链表中倒数第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 *p=pListHead;
ListNode *pre=pListHead;
if(pListHead==NULL || k==0)
return NULL;
while(pre->next && k>1){
pre=pre->next;
k--;
}
if(k>1)
return NULL;
else{
while(pre->next!=NULL){
pre=pre->next;
p=p->next;
}
return p;
}
}
};