一:题目描述
输入一个链表,输出该链表中倒数第k个结点。
二:解题分析
目标只遍历链表一次
通过定义两个指针实现
第一个指针从链表的头指针开始遍历向前走k-1步,第二个指针保持不动。
从第k步起,第二个指针也开始从头指针开始遍历。
由于两个指针的距离保持在k-1,当第一个指针到达链表的尾结点(记为倒数第一个),第二个指针正好走到倒数第k个结点
注意边界条件:
输入的头指针为空
输入的k=0
链表的总的节点数,少于k得大小
以上三种情况都要返回NULL
三:代码实现
/*
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=0返回NULL
if(pListHead==NULL || k==0)
return NULL;
ListNode* pNode=pListHead;
ListNode* pBehind=NULL;
for(int i=1;i<=k-1;i++){
//判断k是否大于链表长度
if(pNode->next!=NULL)
pNode=pNode->next;
else
return NULL;
}
pBehind=pListHead;
while(pNode->next!=NULL){
pNode=pNode->next;
pBehind=pBehind->next;
}
return pBehind;
}
};