定义两个指针。第一个指针从链表的头指针开始遍历向前走k-1,第二个指针保持不动;从第k步开始,第二个指针也开始从链表的头指针开始遍历。由于两个指针的距离保持在k-1,当第一个(走在前面的)指针到达链表的尾结点时,第二个指针(走在后面的)指针正好是倒数第k个结点。
#include<iostream>
using namespace std;
struct ListNode {
int val;
struct ListNode *next;
};
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k)
{
//鲁棒性
if (pListHead == NULL || k == 0)
{
return NULL;
}
ListNode *pAhead = pListHead;
ListNode *pBehind = pListHead;
for (unsigned int i = 1; i <= k - 1; i++) //unsigned是为了处理k=0,i=-1的情况
{
if (pAhead->next != NULL)
{
pAhead = pAhead->next;
}
else
{
return NULL;
}
}
while (pAhead->next != NULL)
{
pAhead = pAhead->next;
pBehind = pBehind->next;
}
return pBehind;
}
int main()
{
ListNode *head =NULL;
ListNode *end =NU