分析: 这是一个单链表算法题,题中说要在不改变链表本身的前提下,设计一个尽可能高效的算法,说明时间复杂度、空间复杂度都要尽可能地高效,常数也要尽可能小。
思路: 设置两个指针p和q,指p针在指针q后k个位置上,当q遍历至尾部时,p刚好遍历到了倒数第k个位置上。
图解如下:
代码实现如下:
typedef struct LNode{
int data;
LNode *next;
}LinkList,LNode;
int search(LinkList *list,int k)
{
LNode *p=list->next;
LNode *q=list->next;//使p、q初始时指向头结点
int count=0;
while(q!=NULL)
{
if(count<k)
{
count++;
}
else
{
p=p->next;//当count值大于时,指针p开始和q同步移动
}
q=q->next;
}
if(count<k)
{
return 0;//查找失败
}else
{
cout<<p->data;//查找成功则返回data指;
return 1;
}
}