单链表的长度,单链表倒数第k个数据

  • 求单链表中节点的个数
    • 思路分析
    • 完整代码
  • 查找单链表中倒数第k个节点
    • 思路如下:
    • 全量代码

求单链表中节点的个数

在上一节代码的基础上我们来学习

思路分析

  1. 我们创建的链表为有头节点的链表,我们不可以计算它的头节点;
  2. 找到头节点,去遍历其一共有多少个节点;
  3. 要排除链表为空的情况。
    代码演示:
    //get singleLinkedList's node number(not head node)public static int getLength(HeroNode head){if (head.next == null){System.out.println("The LinkList is Empty");return 0;}int length = 0;//定义一个辅助变量HeroNode cur = head.next;while(cur != null){length++;cur = cur.next;}return length;}

在main方法中加入

   //Test LinkedList lengthSystem.out.println(getLength(singleLinkedList.getHead()));

运行

完整代码

public class SingleLinkedListDemo {public static void main(String[] args) {//进行测试HeroNode hero1 = new HeroNode(1,"宋江","及时雨");HeroNode hero2 = new HeroNode(2,"卢俊义","玉麒麟");HeroNode hero3 = new HeroNode(3,"吴用","智多星");HeroNode hero4 = new HeroNode(4,"林冲","豹子头");SingleLinkedList singleLinkedList = new SingleLinkedList();//加入英雄singleLinkedList.addByOrder(hero1);singleLinkedList.addByOrder(hero4);singleLinkedList.addByOrder(hero2);singleLinkedList.addByOrder(hero3);//显示一把singleLinkedList.list();//Test LinkedList lengthSystem.out.println(getLength(singleLinkedList.getHead()));}//get singleLinkedList's node number(not head node)public static int getLength(HeroNode head){if (head.next == null){System.out.println("The LinkList is Empty");return 0;}int length = 0;//定义一个辅助变量HeroNode cur = head.next;while(cur != null){length++;cur = cur.next;}return length;}}//定义SingleLinkedList管理我们的英雄
class SingleLinkedList{//初始化一个头节点,不存放具体数据private HeroNode head = new HeroNode(0,"","");public HeroNode getHead() {return head;}//不考虑顺序,找到链表的最后节点,将最后的next指向新的节点public void addHero(HeroNode heroNode){HeroNode temp = head;//遍历链表找到最后一个while(true){if(temp.next == null){break;}temp = temp.next;}temp.next = heroNode;}//添加方法二public void addByOrder(HeroNode heroNode){//因为头节点不能动HeroNode temp = head;//因为是处于添加到的节点上boolean flag = false;//添加的编号是否存在while(true){if(temp.next == null){break;}if(temp.next.no > heroNode.no){  //说明我的heroNode应该插入到这个temp的后面break;}else if (temp.next.no == heroNode.no){flag = true;break;}temp = temp.next; //后移}//判断flag的值if (flag){System.out.printf("准备插入的英雄%d已经有了\n",heroNode.no);}else {//插入数据heroNode.next = temp.next;temp.next = heroNode;}}//显示链表public void list(){if(head.next == null){System.out.println("链表为空");return;}HeroNode tmp = head.next;while (true){if(tmp.next == null){System.out.println(tmp);break;}System.out.println(tmp);tmp = tmp.next;}}
}class HeroNode{public int no;public String name;public String nickName;public HeroNode next; //指向下一个节点//构造器public HeroNode(int hNo,String hName,String hNickName) {this.no = hNo;this.name = hName;this.nickName = hNickName;}//重写toString@Overridepublic String toString() {return "HeroNode{" +"no=" + no +", name='" + name + '\'' +", nickName='" + nickName + '\'' +'}';}}

查找单链表中倒数第k个节点

思路如下:

1.编写一个方法,接受head节点
2.同时接收index, index指的是倒数第index个节点
3.先把链表从头到尾遍历,得到链表的总长度
4.我们遍历size - index个,如果找到就返回该节点,负责返回空

编写找倒数第k个节点的方法

    //Sina Interview Questionspublic static HeroNode findLastNode(HeroNode head, int k){if(  head.next == null){System.out.println("linkedList is Empty");return null;}int length = getLength(head);if(k<=0 || k> length){System.out.println("The input number is not right");return null;}//Define an auxiliary variableHeroNode cur = head.next;for (int i = 0; i < length - k; i++) {cur = cur.next;}return cur;}

在main方法中调用

    HeroNode lastNode = findLastNode(singleLinkedList.getHead(), 2);System.out.println(lastNode);

运行结果(倒数第2个)

全量代码

package com.chad.lambda;public class SingleLinkedListDemo {public static void main(String[] args) {//进行测试HeroNode hero1 = new HeroNode(1,"宋江","及时雨");HeroNode hero2 = new HeroNode(2,"卢俊义","玉麒麟");HeroNode hero3 = new HeroNode(3,"吴用","智多星");HeroNode hero4 = new HeroNode(4,"林冲","豹子头");SingleLinkedList singleLinkedList = new SingleLinkedList();//加入英雄singleLinkedList.addByOrder(hero1);singleLinkedList.addByOrder(hero4);singleLinkedList.addByOrder(hero2);singleLinkedList.addByOrder(hero3);//显示一把singleLinkedList.list();//Test LinkedList lengthSystem.out.println(getLength(singleLinkedList.getHead()));HeroNode lastNode = findLastNode(singleLinkedList.getHead(), 2);System.out.println(lastNode);}//Sina Interview Questionspublic static HeroNode findLastNode(HeroNode head, int k){if(  head.next == null){System.out.println("linkedList is Empty");return null;}int length = getLength(head);if(k<=0 || k> length){System.out.println("The input number is not right");return null;}//Define an auxiliary variableHeroNode cur = head.next;for (int i = 0; i < length - k; i++) {cur = cur.next;}return cur;}//get singleLinkedList's node number(not head node)public static int getLength(HeroNode head){if (head.next == null){System.out.println("The LinkList is Empty");return 0;}int length = 0;//定义一个辅助变量HeroNode cur = head.next;while(cur != null){length++;cur = cur.next;}return length;}}//定义SingleLinkedList管理我们的英雄
class SingleLinkedList{//初始化一个头节点,不存放具体数据private HeroNode head = new HeroNode(0,"","");public HeroNode getHead() {return head;}//不考虑顺序,找到链表的最后节点,将最后的next指向新的节点public void addHero(HeroNode heroNode){HeroNode temp = head;//遍历链表找到最后一个while(true){if(temp.next == null){break;}temp = temp.next;}temp.next = heroNode;}//添加方法二public void addByOrder(HeroNode heroNode){//因为头节点不能动HeroNode temp = head;//因为是处于添加到的节点上boolean flag = false;//添加的编号是否存在while(true){if(temp.next == null){break;}if(temp.next.no > heroNode.no){  //说明我的heroNode应该插入到这个temp的后面break;}else if (temp.next.no == heroNode.no){flag = true;break;}temp = temp.next; //后移}//判断flag的值if (flag){System.out.printf("准备插入的英雄%d已经有了\n",heroNode.no);}else {//插入数据heroNode.next = temp.next;temp.next = heroNode;}}//显示链表public void list(){if(head.next == null){System.out.println("链表为空");return;}HeroNode tmp = head.next;while (true){if(tmp.next == null){System.out.println(tmp);break;}System.out.println(tmp);tmp = tmp.next;}}
}class HeroNode{public int no;public String name;public String nickName;public HeroNode next; //指向下一个节点//构造器public HeroNode(int hNo,String hName,String hNickName) {this.no = hNo;this.name = hName;this.nickName = hNickName;}//重写toString@Overridepublic String toString() {return "HeroNode{" +"no=" + no +", name='" + name + '\'' +", nickName='" + nickName + '\'' +'}';}}

数据结构与算法-单链表的常见面试题(单链表的长度,单链表倒数第k个数据)相关推荐

  1. 算法面试必备-----数据分析常见面试题

    算法面试必备-----数据分析常见面试题 算法面试必备-----数据分析常见面试题 1.统计学问题 问题:贝叶斯公式复述并解释应用场景 问题:朴素贝叶斯的理解 问题:参数估计 问题:极大似然估计 问题 ...

  2. 算法面试必备-----数据仓库常见面试题

    算法面试必备-----数据仓库常见面试题 算法面试必备-----数据仓库常见面试题 问题:什么叫数据仓库? 问题:数据仓库建模 为什么需要数据仓库建模? 数据仓库建模方法? 1.ER模型 2.维度建模 ...

  3. 通信工程中常用算法c语言,通信工程常见面试题.doc

    通信工程常见面试题 模拟电路 1. 基尔霍夫定理的内容是什么?(仕兰微电子) 基尔霍夫电流定律是一个电荷守恒定律,即在一个电路中流入一个节点的电荷与流出同一个节点的电荷相等. 基尔霍夫电压定律是一个能 ...

  4. php echo表单提交_PHP常见面试题及答案

    1.PHP的意思,它能干些什么? PHP是一个基于服务端来创建动态网站的脚本语言,您可以用PHP和HTML生成网站主页,英文的全称(Professional Home Pages) (1)WEB开发. ...

  5. 【MySQL】索引常见面试题

    文章目录 索引常见面试题 什么是索引 索引的分类 什么时候需要 / 不需要创建索引? 有什么优化索引的方法? 从数据页的角度看B + 树 InnoDB是如何存储数据的? B + 树是如何进行查询的? ...

  6. 搞懂单链表常见面试题

    搞懂单链表常见面试题 Hello 继上次的 搞懂基本排序算法,这个一星期,我总结了,我所学习和思考的单链表基础知识和常见面试题,这些题有的来自 <剑指 offer> ,有的来自<程序 ...

  7. 在单链表写入一组数据代码_链表常见操作和15道常见面试题

    什么是单链表 链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer),简单来说链表并不像数组那样 ...

  8. 非常有用的101道算法部分常见面试题

    非常有用的101道算法部分常见面试题 1. Given a rectangular (cuboidal for the puritans) cake with a rectangular piece ...

  9. 常见面试题:链表3-判断链表是否有环以及环入口节点

    常见面试题3:链表-判断链表是否有环以及环入口节点 内容目录 常见面试题3:链表-判断链表是否有环以及环入口节点 一.判断链表是否有环 1.解法1:使用列表 2.解法2:快慢指针 二.链表环入口节点 ...

最新文章

  1. 如何把一个程序中 Edit 中的文本赋给另一个程序的 Edit ? - 回复 Disk_ 的问题
  2. python0o12_2020年日期表-python实现
  3. css设置鼠标指针光标样式
  4. leetcode 25. Reverse Nodes in k-Group | 25. K 个一组翻转链表(Java)
  5. C#使用StreamReader类读取文件文件
  6. PyCharm常用快捷键和设置
  7. [转帖]三大运营商2G/3G/4G频率分配和网络制式
  8. 【删库不跑路】—Linux系统自杀实验 rm -rf /* 及如何抢救和预防
  9. 使用sqoop导出mysql数据时错误处理【com.mysql.jdbc.RowDataDynami】
  10. kafak 命令使用
  11. 系统学习机器学习之增强学习(五)--马尔可夫决策过程策略TD求解(SARSA)
  12. 生产者消费者模式-Java实现
  13. 自适应的设置字体的方式
  14. python表白代码大全简单-python告白代码,只属于程序员的浪漫
  15. 用Qt自己开发的 数学坐标绘图软件 可用于 论文,报告插图
  16. 身份证阅读器二次开发说明
  17. CSS:line-height是什么?,height是什么?
  18. 第三届阿里巴巴全球数学竞赛落下帷幕,这届90后属实优秀!北大恐成最大赢家!
  19. 已知x,h求y(信号处理)
  20. 获取系统当前时间----sqlServer

热门文章

  1. Python接口自动化测试实战详解,你想要的全都有
  2. python模糊搜索_在Python中使用Whoosh进行模糊搜索
  3. 2022-4-14 基于单片机的汽车灯
  4. Android可更换布局的换肤方案
  5. java重载tostring_什么时候不希望在Java中实现toString()?
  6. 微信小程序开发大赛经验总结
  7. 四大网络电话测评对比新鲜出炉
  8. mtk keypad
  9. 监听器-Listener
  10. OpenStack 环境配置