【2009统考真题】已知一个带有表头结点的单链表,假设该链表只给出了头指针list。在不改变链表的前提下,查找链表中倒数第k个位置上的结点。

题目:

已知一个带有表头结点的单链表,结点结构为
data link
假设该链表只给出了头指针list。在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k个位置上的结点(k为正整数)。若查找成功,算法输出该结点的data域的值,并返回1;否则,只返回0。要求:
1)描述算法的基本设计思想。
2)描述算法的详细实现步骤。
3)根据设计思想和实现步骤,采用程序设计语言描述算法(使用C、C++或Java语言实现),关键之处请给出简要注释。

思想: 

问题的关键是设计一个尽可能高效的算法,通过链表的一次遍历,找到倒数第k个结点的位置。算法的基本设计思想是:定义两个指针变量p和q,初始时均指向头结点的下一个结点(链表的第一个结点),P指针沿链表移动;当p指针移动到第k个结点时,q指针开始与p指针同步移动;当p指针移动到最后一个结点时,q指针所指示结点为倒数第k个结点。以上过程对链表仅进行一遍扫描。
2)算法的详细实现步骤如下:
①count=0,p和q指向链表表头结点的下一个结点。
②若p为空,转⑤。
③若count等于k,则q指向下一个结点;否则,count=count+1。
④P指向下一个结点,转②。
⑤若count等于k,则查找成功,输出该结点的data域的值,返回1;否则,说明k值超过了线性表的长度,查找失败,返回0。

代码:

typedef int ElemType;//链表数据的类型定义
typedef struct LNode {//链表结点的结构定义
ElemTypedata;//结点数据
struct LNode *link;//结点链接指针
}LNode, *LinkList;
int Search_k(LinkList list,int k){
LNode *p=list->link,*q=list->link;//指针p、q指示第一个结点
int count=0;//遍历链表直到最后一个结点
while(p!=NULL){
if (count<k) count++;//计数,若count<k只移动p
else q=q->link;
p=p->link;//之后让p、q同步移动
}//while
if(count<k)
return 0;//查找失败返回0
else {
printf("%d",q->data);
return 1;//否则打印并返回1

考察知识: 

单链表的基本操作 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值