栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

考研数据结构(每日一题)day21

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

考研数据结构(每日一题)day21

考研数据结构(每日一题)

题目:已知一个带有表头结点的单链表,结点结构为


假设该链表只给出了头指针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 link;
            p = p -> link;      //p、q同时移动
        }
    }
    if(count < k){
        return 0;            //查找失败返回0
    }else{
        printf("%d",q -> data);     //否则打印并返回1
        return 1;
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/768064.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号