题目:已知一个带有表头结点的单链表,结点结构为data|link,假设该链表只给出了头指针list。在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k个位置上的结点(k为正整数)。
若查找成功,算法输出该结点的data域的值,并返回1;否则,只返回0。
关键字:带头结点单链表+倒数查找

思路
关注:
本题的关键是设计一个尽可能高效的算法,通过链表的一次遍历,找到倒数第k个结点的位置。运用“空间调换”的思想

发现:
倒数第k个元素,永远就是正数第n+1-k个元素,
利用此规律可以让某个指针先前进k个位置,成为正数第k个元素,那么它距离走完整个链表的剩余的位置数,就是想要达成成为倒数第k个元素的那个元素所需要从第一个位置开始前进的位置数。

实操设计思想:
定义两个指针变量p和q,初始时均指向头结点的下一个结点(链表的第一个结点)
p指针沿着链表移动;当p指针移动到第k个结点时,q指针开始与p指针同步移动。
当p指针移动到最后一个结点时,q指针所指示结点为倒数第k个结点。

以上过程仅对链表进行一次扫描,很高效

步骤:
1.count=0,p和q指向链表表头结点的下一个结点(第一个结点)
2.若p为空,转5
3.若count=k,则q指向下一个结点;否则,count=count+1
4.p指向下一个结点,转2
5.若count等于k,则查找成功,输出该结点的data,返回1;
否则,说明k值超过了线性表的长度,查找失败,返回0
6.算法结束

需要变量:正数工作指针p,倒数工作指针q,位置移动小助手:count

typedef int ElemType;
typedef struct LNode{ElemType data;struct LNode *link;}LNode,*LinkListl
int Search_k(LinkList L,int k){LNode*p=L->next,*q=L->next;int count=0;while(p!=NULL){if(count<k)count++;elseq=q->next;p=p->next;}if(count<k)//说明提前出现了p=Null的情况,输入的k大于原线性表的长度return 0;else {//count等于k了printf("%d",q->data);return 1;}}

小白算法积累——单链表21#带头结点单链表+倒数查找相关推荐

  1. 小白算法积累——单链表6#带头结点单链表+递增有序

    题目:有一个带头结点的单链表L,设计一个算法使其元素递增有序. 关键字:带头结点单链表+递增有序 思路 采用直接插入排序算法的思想:就是先分理出头结点+第一个结点组成原始新链表,然后依次将后续结点摘下 ...

  2. 小白算法积累——单链表13#带头结点单链表+就地归并+改序

    题目:假设有两个按元素值递增次序排列的线性表,均以单链表的形式存储.请编写算法将这两个单链表归并为一个按元素值递减次序排列的单链表,并要求利用原来两个单链表的结点存放归并后的单链表. 关键字:带头结点 ...

  3. 数据结构之不带头结点单链表和带头结点单链表相关操作实现(C语言)

    文章目录 单链表定义 不带头结点单链表 带头结点单链表 头结点和头指针的区分 带头结点单链表优点 单链表定义 线性表的链式存储又称单链表,它是指通过一组任意的存储单元来存储线性表中的数据元素. 不带头 ...

  4. #数据结构:编写不带头结点单链表的建立、插入和删除算法

    编写不带头结点单链表的建立.插入和删除操作算法. 一.问题描述 编写一个不带头节点的单链表 二.基本要求 1) 建立 2) 插入 3) 删除 三.算法思想 选用不带头结点的单链表,在第一个元素节点前插 ...

  5. 带头结点单链表就地逆置算法

    1.带头结点单链表就地逆置算法 部分函数调用参考如下:https://blog.csdn.net/qq_50504109/article/details/120288749 /*** 单向链表的逆置, ...

  6. 算法与数据结构之带头结点和不带头结点单链表存在的问题

    带头结点和不带头结点单链表注意的小细节 在写不带头结点的单链表中发现了一个问题,这个问题在带头结点的单链表中也存在,那就是值传递的问题. 首先来看一下 #include<stdio.h> ...

  7. 【数据结构与算法】 01 链表 (单链表、双向链表、循环链表、块状链表、头结点、链表反转与排序、约瑟夫环问题)

    一.线性表 1.1 概念与特点 1.2 线性表的存储结构 1.3 常见操作 1.4 应用场景 二.链表 2.1 链表简介 2.2 单向链表(单链表) 2.21 基本概念 2.22 单链表基本操作 2. ...

  8. 创建带头结点单链表实现二进制数加1的运算

    题目描述: 建立一个带头结点的线性链表,用以存放输入的二进制数,链表中每个结点的data域存放一个二进制位.在此链表上实现对二进制数加1的运算,并输出运算结果. 测试数据1: 1010011 测试数据 ...

  9. 单链表(带头结点)的存储结构与基本操作(c语言)------亲测可用

    编程语言:c语言 编译环境:Dev-c++ 实现功能:实现功能:单链表(带头结点)结点结构体的定义,单链表(带头结点)初始化.求元素个数.插入元素.删除元素.取元素.打印所有元素.就地逆置.撤销的操作 ...

最新文章

  1. 神经网络有什么理论支持? 本文作者:AI研习社 2017-11-08 18:30 导语:问:神经网络有什么理论支持? 答:目前为止(2017 年)没有什么特别靠谱的。 雷锋网按:本文原作者袁洋
  2. phpcms避免字段值重复
  3. (转)ComputerStyle与currentStyle的区别
  4. centos 6.5 安装mysql rpm_centos6.5 rpm 安装mysql5.6
  5. 量化交易(QuantitativeTrading)
  6. python编译器源码分析_Python源码剖析之编译Python
  7. Android颜色选择器
  8. 股票:巧用均线多头排列选股
  9. 激情巴布部落畅快一日游
  10. 如何通过回测报告中的指标评估策略优劣?
  11. 服务器显卡直通和GPU问题分析
  12. 志愿者积分兑换小程序开发制作
  13. 全息投影助力餐厅,满足全新市场需求
  14. reverse()函数
  15. Ubuntu设为桥接模式自动获取ip但无法上网
  16. 请java老鸟指教一下
  17. arccotx图像在matlab,反三角函数图像与性质是什么?
  18. AntV G2 饼图
  19. 计算机系统性能取决于,计算机的性能主要取决于什么,
  20. 苹果CMS付费视频影视网站模板带完整会员中心模板

热门文章

  1. tiny4412编译与移植uboot
  2. chosen用法及动态绑定值
  3. linux命令 acc,sed linux 命令 在线中文手册
  4. kail linux纯文本浏览器,在Linux Mint/Kali Linux上安装Vivaldi Web浏览器的方法
  5. 性能分析—查询运行慢的原因(SQLServer2008宝典)
  6. 跨平台基础网络框架Mars初探
  7. Laravel-Admin 自定义操作按钮大全(表格工具区域、行内操作按钮)
  8. C#学习之音乐播放器
  9. JAVA classpath设置方式启动详解:java class名、java -jar
  10. coot 无法识别DNA/RNA的解决方法