/*
问题描述:查找单链表中倒数第k个元素
说明:这个题直接想到的就是先遍历整个链表,得到链表的长度length,然后再次遍历第length-k个元素,即是所求的结点。
查了相关资料,牛人自有新招。可以用两个指针p,q,一开始两个指针均指向开始处q指针先走k步(前移k个结点),然后p结点和q结点一起移动,当q结点到达尾部时,p结点就是所求的结点。这个算法,仔细想想就是q指针比p指针多走了k步,总共q走完了length,那么p自然到达length-k.
这种思路使得只要遍历一次单链表就可实现目的。
*/
//查找单链表中倒数第k个元素
int SearchReverse_k(LinkList L,int k)
{
LNode *p,*q; //两个指针
int coun = 0;
q = L->next;
while(q != NULL) //先将q指针向前移动k个位置
{
q = q->next;
if(++coun >= k)
break;
}
//输入出错处理
if(q == NULL || k<=0 )
{
if(coun != k)
{
cout<<"k is illegal,return -1"<<endl;
return -1;
}
}
p = L->next;
while(q != NULL) //p和q一起移动,当q到达末尾的时候,p就是所需的结点
{
q = q->next;
p = p->next;
}
return p->data;
}
总结:本问题的算法思路还可以用于其他关于链表位置、长度有差别的问题上。比如说:求两个链表的公共结点。没猜错的话,这叫做双指针法。