题目:
输入一个链表,输出该链表中倒数第k个结点。
思路:
方法1:从前往后扫描链表,先遍历一次统计出节点总数N,然后遍历一次找到第N-k个节点输出。缺点:需要遍历两次。
方法2:设置两个指针,一个指针p1从头指针开始先走k步,然后让第二个指针p2指向头指针,然后两个指针一起往后走,当p1指向最后一个节点时,p2指向的就是倒数第k个节点。
要注意的是特殊情况的处理:空链表,k>N,k<=0。
在线测试:
AC代码:
/*
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 == NULL || k <= 0)
return NULL;
ListNode* p1 = pListHead;
int i=1;
while(p1->next && i<k)
{
p1 = p1->next;
i++;
}
if(i<k)
{
return NULL;
}
ListNode* p2 = pListHead;
while(p1->next)
{
p1 = p1->next;
p2 = p2->next;
}
return p2;
}
};