题目:
有一张单链表,编写函数求倒数第K个节点(要求只能遍历一次链表)
思路:
为了能够只遍历一次就能找到倒数第k个节点,可以定义两个指针:
- 第一个指针从链表的头指针开始遍历向前走k-1,第二个指针保持不动;
- 从第k步开始,第二个指针也开始从链表的头指针开始遍历;
- 由于两个指针的距离保持在k-1,当第一个(走在前面的)指针到达链表的尾结点时,第二个指针(走在后面的)指针正好是倒数第k个结点。
代码如下:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
//刚开始的时候,都指向起点,然后p1走k-1步后,p2和p1同时开始走,当p1走到最后一个的时候,p2指向的就是 最后一个节点
ListNode *p1 = pListHead;
ListNode *p2 = pListHead;
if(pListHead==NULL || k == 0) {
return NULL;
}
while( k-1 > 0)
{
if(p1->next != NULL)
{
p1 = p1->next;
--k;
}
else
{
cout<<"error"<<endl;
return NULL;
}
}
while(p1->next != NULL)
{
p1 = p1->next;
p2 = p2->next;
}
return p2;
}