目录

用单链表来实现简单的增删改

面试题

求单链表中有效节点个数

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

单链表的反转(有点难度)

从尾到头(逆序)打印单链表【要求方式1.反向遍历 2.Stack栈】

合并两个有序的单链表,合并之后的链表依然是有序的


  1. 链表是有序的列表,是以节点的方式来存储,是链式存储。链表的各个节点不一定是连续存放
  2. 每个节点包含data域和next域(指向下一个节点)
  3. 无论是删除还是添加,都要找到待处理节点的前一个节点
  4. 链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定
  5. 头节点不存放具体的数据,作用就是表示单链表的头

用单链表来实现简单的增删改

public class SingleLinkedListDemo {public static void main(String[] args) {HeroNode h1=new HeroNode(1,"宋江","及时雨");HeroNode h2=new HeroNode(2,"卢俊义","玉麒麟");HeroNode h3=new HeroNode(3,"吴用","智多星");HeroNode h4=new HeroNode(4,"林冲","豹子头");SingleLinkedList sl=new SingleLinkedList();
//System.out.println("不考虑英雄编号顺序添加的测试");
//      sl.add(h1);
//      sl.add(h2);
//      sl.add(h3);
//      sl.add(h4);
//      sl.list();System.out.println("考虑英雄编号顺序添加的测试");sl.addByOrder(h1);sl.addByOrder(h4);sl.addByOrder(h2);sl.addByOrder(h3);
//      sl.addByOrder(h3);
//      sl.list();HeroNode newh2=new HeroNode(2,"小卢","玉麒麟~~");sl.update(newh2);sl.del(1);sl.del(2);sl.del(3);sl.del(4);sl.list();}}
//定义一个SingleLinkedList来管理我们的英雄
class SingleLinkedList{//先初始化一个头节点,头节点不要动,不存在具体数据private HeroNode head=new HeroNode(0, "", "");//添加节点到单向链表public void add(HeroNode heronode) {//因为head节点不能动,因此我们需要一个辅助变量tempHeroNode temp=head;//temp相当于指针while(true) {//找到链表的最后if(temp.next==null) {break;}//如果没有找到最后,就将temp后移temp=temp.next;}//当退出while循环时,temp就指向了链表的最后temp.next=heronode;}public void addByOrder(HeroNode heronode) {//因为head节点不能动,因此我们需要一个辅助指针temp来帮助找到添加位置//因为是单链表,因为我们找的temp是位于添加位置的前一个节点!!!否则添加不了HeroNode temp=head;boolean flag=false;//标志添加的编号是否存在,默认为falsewhile(true) {if(temp.next==null) {//说明temp已经到链表的最后break;}if(temp.next.no>heronode.no) {//位置找到,就在temp的后面break;}else if(temp.next.no==heronode.no){//说明希望 添加的编号已经存在flag=true;break;}temp=temp.next;}if(flag==true) {System.out.printf("准备插入的英雄编号%d已经存在,不能加入\n",heronode.no);}else {heronode.next=temp.next;temp.next=heronode;}}//修改节点的信息,根据no编号来修改,即no编号不能改public void update(HeroNode heronode) {if(head.next==null) {System.out.println("链表为空");return;}HeroNode temp=head.next;boolean flag=false;while(true) {if(temp==null) {break;//已经遍历完}if(temp.no==heronode.no) {flag=true;break;}temp=temp.next;}if(flag==true) {temp.name=heronode.name;temp.nickName=heronode.nickName;}else {System.out.printf("没有找到编号等于%d的节点\n",heronode.no);}}//删除节点public void del(int n) {HeroNode temp=head;boolean flag=false;while(true) {if(temp.next==null) {break;}if(temp.next.no==n) {flag=true;break;}temp=temp.next;}if(flag==true) {temp.next=temp.next.next;}else {System.out.printf("要删除的%d节点不存在\n",n);}}//显示链表[遍历]public void list() {//判断是否为空if(head.next==null) {System.out.println("链表为空");return;}//因为head节点不能动,因此我们需要一个辅助变量tempHeroNode temp=head.next;while(true) {//是否到链表的最后if(temp==null) {break;}System.out.println(temp);//将temp后移!!!temp=temp.next;}}
}
//先定义一个HeroNode,每个HeroNode对象就是一个节点
class HeroNode{public int no;//英雄编号,按照编号顺序添加//思路:①首先找到新添加节点的位置,通过辅助指针②新的节点的.next=temp.next③将temp.next=新的节点public String name;//英雄名字public String nickName;//英雄昵称public HeroNode next;//指向下一个节点public HeroNode(int no,String name,String nickname) {this.no=no;this.name=name;this.nickName=nickname;}//为了显示方便,我们重写一遍toString方法public String toString() {return "HeroNode [no=" + no + ", name=" + name + ", nickName=" + nickName+"]" ;}}

面试题

  • 求单链表中有效节点个数

主类中添加方法

//方法:获取单链表的有效个数(如果是带头节点的链表需要不统计头节点)public static int getLen(HeroNode head){//head是头节点,返回有效节点的个数if(head.next==null) {return 0;}int length=0;HeroNode cur=head.next;while (cur!=null) {length++;cur=cur.next;}return length;}

在 SingleLinkedList类中添加方法,返回头节点

public HeroNode getHead() {return head;}
  • 查找单链表中的倒数第k个节点

①编写一个方法,接收head节点,同时接收一个index

②index表示的是倒数第index个节点

③先把链表从头到尾遍历得到链表的总的长度getLen

④得到size后我们从链表的第一个开始遍历(size-index)个

public static HeroNode findLastIndexNode(HeroNode head,int index) {if(head.next==null)return null;int size=getLen(head);if(index<=0||index>size)return null;HeroNode temp=head.next;for(int i=0;i<size-index;i++) {temp=temp.next;}return temp;}
  • 单链表的反转(有点难度)

思路:①先定义一个节点reverseHead=new HeroNode();

②从头到尾遍历原来的链表,每遍历一个节点,就将其取出,并放在新的链表reverseHead的最前边(新链表头节点后)

③原来的链表的head.next=reverseHead.next

public static void reverseList(HeroNode head) {//如果当前链表为空或者只有一个节点,就无需反转if(head.next==null ||head.next.next==null) {return;}//辅助指针,帮助遍历原来链表HeroNode temp=head.next;HeroNode next=null;//指向当前节点的下一个节点HeroNode reverseHead =new HeroNode(0, null, null);//遍历原来的链表while(temp!=null) {next=temp.next;//先暂时保存当前节点的下一个节点,因为后面需要使用temp.next=reverseHead.next;//将temp的下一个节点指向新的链表的最前端reverseHead.next=temp;//将temp连接到新的链表上temp=next;}//将Head.next指向reverseHead.next,实现单链表的反转head.next=reverseHead.next;} 

从尾到头(逆序)打印单链表【要求方式1.反向遍历 2.Stack栈】

方式1:先将单链表进行反转操作,然后再遍历即可:这样做的问题是会破坏原来的单链表的结构,不建议这样操作

方式2:可以利用栈这个数据结构,将各个节点压入到栈中,然后利用栈的先进后出的特点,就实现了逆序打印的效果

public static void reversePrint(HeroNode head) {if(head.next==null)return;//空链表,不能打印//创建一个栈,将各个节点压入栈中Stack<HeroNode> stack=new Stack<HeroNode>();HeroNode cur=head.next;while(cur!=null) {stack.push(cur);cur=cur.next;//这样就可以压下一个节点}while(stack.size()>0) {System.out.println(stack.pop());}}

合并两个有序的单链表,合并之后的链表依然是有序的

数据结构:单链表(水浒传英雄操作为例)+单链表面试题相关推荐

  1. 数据结构单链表的基础操作(C语言)

    效果如图: 代码及详情如下:(文末总结) 目录 //主函数 //菜单 //创建链表 //插入结点 //删除结点 //查找结点 //链表长度 //打印链表 //清空链表 //逆置链表 //删除偶数元素结 ...

  2. 笔试面试常考数据结构-单链表常用操作编程实现

    单链表是笔试以及面试手写代码中常考的数据结构之一.下面实现了单链表的常见操作:创建单链表.删除节点.打印单链表(包括正向打印以及逆向打印).反转单链表.找出单链表的倒数第K个节点.合并两个有序单链表等 ...

  3. 数据结构单链表的创建以及简单操作

    在数据结构中: 目录 一.数据节点类型结构体封装 二.创建单链表 1.创建链表 2.头部插入 3.遍历链表 4.尾部插入 5.释放链表 链表可以解决顺序表无法开辟连续空间的问题,大大提高了内存的利用率 ...

  4. 数据结构(单链表的相关操作)

    为什么80%的码农都做不了架构师?>>>    #include <stdio.h> #include <stdlib.h> #define ElemType ...

  5. 数据结构单链表插入和删除操作

    单链表:先回顾单链表的特点  逻辑相邻 物理上不一定相连 首先初始化单链表,其中主要保存的是该节点自身的值以及下个节点的地址. 有效节点结构体设计: ​ struct Node{ ​ int data ...

  6. php链表和联表的区别,PHP_浅谈PHP链表数据结构(单链表),链表:是一个有序的列表,但 - phpStudy...

    浅谈PHP链表数据结构(单链表) 链表:是一个有序的列表,但是它在内存中是分散存储的,使用链表可以解决类似约瑟夫问题,排序问题,搜索问题,广义表 单向链表,双向链表,环形链表 PHP的底层是C,当一个 ...

  7. php mysql 链表_浅谈PHP链表数据结构(单链表)

    链表:是一个有序的列表,但是它在内存中是分散存储的,使用链表可以解决类似约瑟夫问题,排序问题,搜索问题,广义表 单向链表,双向链表,环形链表 PHP的底层是C,当一个程序运行时,内存分成五个区(堆区, ...

  8. 单链表的简单操作与演示

    单链表的简单操作与演示 单链表 单链表概念和简单的设计 单链表是一种链式存取的数据结构,链表中的数据是以结点来表示的,每个结点由元素和指针构成. 元素表示数据元素的映象,就是存储数据的存储单元:指针指 ...

  9. SWUSTOJ #953 单链表的删除操作的实现

    SWUSTOJ #953 单链表的删除操作的实现 题目 输入 输出 样例输入 样例输出 源代码 题目 建立长度为 n 的单链表,删除第 i 个结点之前的结点. 输入 第一行为自然数 n,表示链式线性表 ...

最新文章

  1. flask常见面试题
  2. python 时间字符串
  3. 什么是好的API设计?
  4. Existing Linux Wireless drivers
  5. 程序猿的节日:1024,今天祝愿全球所有程序猿们、IT精英们节日快乐!——我在上海写代码
  6. 直播 | CIKM 2021论文解读:基于广群的知识图谱表示学习统一模型框架
  7. 继续Bargaining
  8. 可以通过执行报表RSVMCRT_MINI_DEBUGGER 查看CRM IPC中定价计算公式的相关源代码
  9. 十个模块_专栏 | ABAQUS Part模块的十个小技巧
  10. 喜报!DT最新通用管理平台开源了
  11. java爬虫入门--用jsoup爬取汽车之家的新闻
  12. 【Maven实战】依赖的聚合和版本管理
  13. win10环境,Eclipse安装Maven
  14. dll = MinGW gcc 生成动态链接库 dll 的一些问题汇总
  15. VB判断指定的WORD文档是否被打开
  16. java编程输入学生成绩 判断最高分_从键盘输入本次Java考试五位学生的成绩,求考试成绩最高分_学小易找答案...
  17. 【3】基于深度神经网络的脑电睡眠分期方法研究(数据集分类)
  18. 相关系数的比较与假设检验
  19. 基于thinkphp6开放,免费开源可商用的兴趣社区论坛圈子小程序
  20. 老师必备的数学几何绘图软件,赶紧收藏!

热门文章

  1. BUUCTF-Crypto学习笔记(二)
  2. 耐高压达林顿输出光耦(TLP127,TLP187,TLP627)功能介绍及应用实例
  3. git stash 贮藏你的修改
  4. 【目标检测】YOLO系列Anchor标签分配、边框回归(坐标预测)方式、LOSS计算方式
  5. 成为顶级博主的秘诀是什么?《乘风者周刊》专访“处女座程序猿”牛亚运
  6. 手淘商品详情api接口|淘宝商品详情API接口文档
  7. 百度智能云章淼:详解企业级七层负载均衡开源软件BFE
  8. REST API示例
  9. 牛客练习赛24 - AB
  10. 通俗易懂详解机器学习中的最大似然估计