1,题目
输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始,即链表的尾节点是倒数第一个节点。例如一个链表有6个节点,从第一个节点开始它们的值是1、2、3、4、5、6。这个链表倒数第3个节点是值为4的节点。
2,分析
指定两个指针pbefore和pafter,均指向第一个节点,起先前面的指针pbefore走k步,然后两个指针依次向后走,当pbefore为空时即走到链表外,此时pafter即为倒数第k个节点,这里需要注意当k超出链表节点个数的情况。可以在pbefore往前走k步中判断。
3,代码
int findKthToTail(ListNode **head, int k)
{
if(*head == NULL || k <= 0)
return -1;
ListNode *pbefore, *pafter;
int i = 0;
pbefore = (*head)->next;
pafter = pbefore;
while(pbefore && i < k)
{
pbefore = pbefore->next;
i++;
}
//前面指针还没走k步就已经超出链表(k>链表个数)
if(i < k)
return -1;
while(pbefore)
{
pafter = pafter->next;
pbefore = pbefore->next;
}
return pafter->data;
}