(1)基本思想: 如果设计一个尽可能高效的算法,则需要遍历一遍链表便找到链表中倒数第k个位置上的结点,可以定义两个指针变量p和q,初始时,均指向链表的第一个结点,开始遍历时,p指针先沿链表移动,当p指针移动到第k个结点时,q指针开始与p指针同步移动,当p指针移动到最后一个结点时,q指针所指示结点为倒数第k个结点。(如果遍历链表两遍也可以实现,但不是最优算法,即先遍历一遍得到链表结点数量n,然后再遍历n-k次即可实现)
(2)实现步骤
① 设置count计数,count=0,p和q指向头指针的下一个结点。
② 若p为空,则转⑤。
③ 若count = k,则 q指向下一个结点 (q=q->next);否则,count = count+1。
④ p指向下一个结点(p=p->next),转②。
⑤ 若count = k,则查找成功,输出该结点的data域值,返回1;否则,k值超过链表长度,查找失败,返回0。
⑥ 算法结束。
(3)算法实现
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode, *LinkedList;
int Search(LinkedList list, int k) {
LNode *p = list->next, *q = list->next;
int count = 0;
while(p != NULL) {
if(count < k)
count++;
else
q = q->next;
p = p->next;
}
if(count < k)
return 0;
else {
cout << q->data << endl;
return 1;
}
}