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

这篇博客介绍了如何在单链表中寻找倒数第k个结点的高效算法,只需遍历链表一次。通过设置两个指针p和q,初始时同时指向链表的第二个结点,当p移动到第k个结点时,q开始同步移动。当p到达链表末尾时,q指向的即为倒数第k个结点。代码示例使用C语言实现,查找成功输出结点data并返回1,否则返回0。
摘要由CSDN通过智能技术生成

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

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

在这里插入图片描述
假设该链表只给出了头指针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;
    }
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值