考研数据结构(每日一题)
题目:已知一个带有表头结点的单链表,结点结构为
假设该链表只给出了头指针list,在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k个位置上的结点(k为正整数),若查找成功,算法输出该结点的data域的值。并返回1;否则,返回0.
算法图解:
算法思想:
高效的算法————遍历一次链表就找到倒数第k个位置上的结点
定义两个指针p和q,初识指向头结点的下一个结点(如图),p指针沿链表移动;
当p指针移动到第k个结点时,q指针开始与p指针同时移动;
当p指针移动至最后一个结点时,q指针所指结点为倒数第k个结点。
算法详细步骤:
第一步:count=0,p和q都指向链表头结点的下一个结点
第二步:若p为空,执行第五步
第三步:若count=k,则q指向下一个结点,否则,count=count+1
第四步:p指向下一个结点,之后执行第二步
第五步:若count=k,则查找成功,输出该结点的data域的值,返回1,否则,说明k值超过了线性表的长度,查找失败,返回0
完整代码:
typedef int ElemType; //定义链表数据类型
typedef struct LNode{ //定义链表结构体
ElemType data; //结点数据
struct LNode *link; //结点链接指针
}LNode, *LinkList;
int Search_k(LinkList list,int k){
//查找链表list倒数第k个结点,并输出该结点的data域的值
LNode *p = list -> link;
LNode *q = list -> link; //指针p、q指向第一个结点
int count = 0;
while(p != NULL){ //遍历链表直到最后一个结点
if(count < k){ //计数,若count<k则只移动p
count ++;
}else{
q = q -> link;
p = p -> link; //p、q同时移动
}
}
if(count < k){
return 0; //查找失败返回0
}else{
printf("%d",q -> data); //否则打印并返回1
return 1;
}
}