已知一个带有表头结点的单链表,结点结构为
data | link |
假设该链表只给出了头指针 list,在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第 k 个位置上的结点(k为正整数)。若查找成功,算法输出该结点的 data 域的值,并返回 1;否则,只返回 0。
定义两个指针变量 p 和 q,指向头结点的下一个结点。指针 p 向前遍历 k-1 步,此时 p 指向单链表的第 k 个结点。然后令指针 p 和 q 同时向表尾移动,则指针 p 移动至表尾结点时,指针 q 指向的结点即为链表中倒数第 k 个位置上的结点。
复杂度 O(n)
typedef struct LNode{
int data;
LNode* link;
}LNode,*LinkList;
int Search(LinkList list,int k){
LNode *p = list->link,*q = list->link;
int cnt = 0;
while(p){
if(cnt==k) q = q->link;
else cnt++;
p = p->link;
}
if(cnt < k) return 0;
else{
printf("%d",q->data);
return 1;
}
}