引例:带有表头结点的单链表,结点结构为数据域data,指针域next, 设该链表只给出头指针list。在不改变链表的前提下,设计一个算法查找链表中倒数第k个位置上的结点,查找成功则输出该结点的data域的值,并返回1;否则,只返回0.
答:
(1)算法思想:我们应该定义p,q两个指针变量,一开始的时候都指向链表的第一个结点,p指针沿着链表移动;当p指针移动到第k个位置的结点时,q指针再开始与p同步移动。当p移动到链表最后一个结点的时候,q指针所指向的结点就是倒数第k个结点。
(2)具体实现步骤:
第一步:先定义一个计步器count,令count=0,;同时,指针p和q均指向链表第一个结点;
第二步:如果p为空,则代表链表为空表,转到第五步;
第三步:当count=k时,q就指向下一个结点;否则(else),count=count+1;
第四步:p指向下一个结点,并转到第二步;
第五步:若count=k,则代表了查找成功;
(3)代码
typedef int ElemType; //链表数据的类型定义
typedef struct LNode{ //链表数据的结构定义
ElemType data; //结点数据
struct LNode *link; //结点链接指针
}LNode , *LinkList;
int Search_k(LinkList list,int k){
LNode *p=list->next;
LNode *q=list->next; //指针p,q指向第一个结点
int count=0;//计步器
while(p!=NULL){ //链表不为空表时,遍历链表直至最后一个结点
if(count<k){ //计步,若count<k,则只移动p
count++;
}
else{
q=q->link; //否则,就让q和p同步移动
}

本文详细介绍了单链表的概念、如何查找链表中倒数第k个结点的算法,以及单链表的基本操作,包括头插法、尾插法建立链表,按序号和值查找结点,以及插入结点的方法。文章通过实例和代码解析,加深了对单链表理解。
最低0.47元/天 解锁文章
501

被折叠的 条评论
为什么被折叠?



