数据结构:单链表(水浒传英雄操作为例)+单链表面试题
目录
用单链表来实现简单的增删改
面试题
求单链表中有效节点个数
查找单链表中的倒数第k个节点
单链表的反转(有点难度)
从尾到头(逆序)打印单链表【要求方式1.反向遍历 2.Stack栈】
合并两个有序的单链表,合并之后的链表依然是有序的
- 链表是有序的列表,是以节点的方式来存储,是链式存储。链表的各个节点不一定是连续存放
- 每个节点包含data域和next域(指向下一个节点)
- 无论是删除还是添加,都要找到待处理节点的前一个节点
- 链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定
- 头节点不存放具体的数据,作用就是表示单链表的头
用单链表来实现简单的增删改
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());}}
合并两个有序的单链表,合并之后的链表依然是有序的
数据结构:单链表(水浒传英雄操作为例)+单链表面试题相关推荐
- 数据结构单链表的基础操作(C语言)
效果如图: 代码及详情如下:(文末总结) 目录 //主函数 //菜单 //创建链表 //插入结点 //删除结点 //查找结点 //链表长度 //打印链表 //清空链表 //逆置链表 //删除偶数元素结 ...
- 笔试面试常考数据结构-单链表常用操作编程实现
单链表是笔试以及面试手写代码中常考的数据结构之一.下面实现了单链表的常见操作:创建单链表.删除节点.打印单链表(包括正向打印以及逆向打印).反转单链表.找出单链表的倒数第K个节点.合并两个有序单链表等 ...
- 数据结构单链表的创建以及简单操作
在数据结构中: 目录 一.数据节点类型结构体封装 二.创建单链表 1.创建链表 2.头部插入 3.遍历链表 4.尾部插入 5.释放链表 链表可以解决顺序表无法开辟连续空间的问题,大大提高了内存的利用率 ...
- 数据结构(单链表的相关操作)
为什么80%的码农都做不了架构师?>>> #include <stdio.h> #include <stdlib.h> #define ElemType ...
- 数据结构单链表插入和删除操作
单链表:先回顾单链表的特点 逻辑相邻 物理上不一定相连 首先初始化单链表,其中主要保存的是该节点自身的值以及下个节点的地址. 有效节点结构体设计: struct Node{ int data ...
- php链表和联表的区别,PHP_浅谈PHP链表数据结构(单链表),链表:是一个有序的列表,但 - phpStudy...
浅谈PHP链表数据结构(单链表) 链表:是一个有序的列表,但是它在内存中是分散存储的,使用链表可以解决类似约瑟夫问题,排序问题,搜索问题,广义表 单向链表,双向链表,环形链表 PHP的底层是C,当一个 ...
- php mysql 链表_浅谈PHP链表数据结构(单链表)
链表:是一个有序的列表,但是它在内存中是分散存储的,使用链表可以解决类似约瑟夫问题,排序问题,搜索问题,广义表 单向链表,双向链表,环形链表 PHP的底层是C,当一个程序运行时,内存分成五个区(堆区, ...
- 单链表的简单操作与演示
单链表的简单操作与演示 单链表 单链表概念和简单的设计 单链表是一种链式存取的数据结构,链表中的数据是以结点来表示的,每个结点由元素和指针构成. 元素表示数据元素的映象,就是存储数据的存储单元:指针指 ...
- SWUSTOJ #953 单链表的删除操作的实现
SWUSTOJ #953 单链表的删除操作的实现 题目 输入 输出 样例输入 样例输出 源代码 题目 建立长度为 n 的单链表,删除第 i 个结点之前的结点. 输入 第一行为自然数 n,表示链式线性表 ...
最新文章
- flask常见面试题
- python 时间字符串
- 什么是好的API设计?
- Existing Linux Wireless drivers
- 程序猿的节日:1024,今天祝愿全球所有程序猿们、IT精英们节日快乐!——我在上海写代码
- 直播 | CIKM 2021论文解读:基于广群的知识图谱表示学习统一模型框架
- 继续Bargaining
- 可以通过执行报表RSVMCRT_MINI_DEBUGGER 查看CRM IPC中定价计算公式的相关源代码
- 十个模块_专栏 | ABAQUS Part模块的十个小技巧
- 喜报!DT最新通用管理平台开源了
- java爬虫入门--用jsoup爬取汽车之家的新闻
- 【Maven实战】依赖的聚合和版本管理
- win10环境,Eclipse安装Maven
- dll = MinGW gcc 生成动态链接库 dll 的一些问题汇总
- VB判断指定的WORD文档是否被打开
- java编程输入学生成绩 判断最高分_从键盘输入本次Java考试五位学生的成绩,求考试成绩最高分_学小易找答案...
- 【3】基于深度神经网络的脑电睡眠分期方法研究(数据集分类)
- 相关系数的比较与假设检验
- 基于thinkphp6开放,免费开源可商用的兴趣社区论坛圈子小程序
- 老师必备的数学几何绘图软件,赶紧收藏!