单链表算法设计(含大厂面试题)
目录
- 1.单链表介绍与内存布局
- 2.单链表的应用示例
- 2.1 单链表的创建和遍历的分析实现
- 2.2 单链表按照顺序插入信息
- 2.3 单链表结点的修改
- 2.4 单链表结点的删除
- 3.大厂面试题
- 3.1.查找单链表中的倒数第k个结点(新浪面试题)
- 3.2.单链表的反转(腾讯面试题)
- 3.3.从尾到头打印单链表(百度面试题)
1.单链表介绍与内存布局
链表是有序的列表,但是它在内存中是存储如下:
小结:
1)链表是以节点的方式来存储,是链式存储
2)每个节点包含data域,next域: 指向下一个节点.
3)如图:发现链表的各个节点不一定是连续存储.
4)链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定
单链表(带头结点)逻辑结构示意图如下
2.单链表的应用示例
使用带head头的单向链表实现-水浒英雄排行榜管理
1)完成对 英雄人物的增删改查操作,注: 删除和修改,查找.
2)第一 种方法在添加英雄时,直接添加到链表的尾部
3)第二种方式在添加英雄时,根据排名将英雄插入到指定位置
(如果有这个排名,则添加失败,并给出提示)
2.1 单链表的创建和遍历的分析实现
单链表的创建示意图,显示单向链表的分析
class HeroNode{int no; //编号String name;String nickname; //昵称HeroNode next;
}
添加(创建)
1.先创建一个head头节点,作用就是表示单链表的头
2.后面我们每添加一个节点,就直接加入到链表的最后
遍历:
1.通过一个辅助变量遍历,帮助遍历整个链表
单链表判断最后一个结点的方法:判断结点的next域是否为空
以下代码实现链表插入和遍历
//定义HeroNode,每个HeroNode对象就是一个结点
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 + '\'' +'}';}
}
//定义SingleLinkedList来管理我们的英雄
class SingleLinkedList{//先初始化头结点,头结点不要动,不存放具体数据private HeroNode head=new HeroNode(0,"","");//添加结点到单向链表/*添加元素的时候,最重要的就是要找到链表的最后一个结点。(尾插法)。然后让最后一个结点的next域指向最新的结点。* *///思路:当不考虑编号顺序时//1.找到当前链表的最后结点//2.将最后结点的next域指向新的结点即可public void add(HeroNode heroNode){//因为head结点不能动,因此我们需要一个辅助变量HeroNode temp=head;//遍历链表,找到最后while(true){//找到链表的最后if(temp.next==null){break;}//如果没有找到最后,就将temp后移temp=temp.next;}//当退出while循环时,temp就指向了最后//将最后这个结点的next指向新的结点temp.next=heroNode;}//显示链表[遍历]public void list(){//先判断链表是否为空if(head.next==null){System.out.println("链表为空");return ;}//因为头结点不能动,我们需要辅助变量来比那里HeroNode temp=head.next;//如果temp所指结点不为空,那么我们就可以打印while(temp!=null){System.out.println(temp); //输出结点信息temp=temp.next; //一定小心,要后移,否则死循环}}}
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.add(hero1);singleLinkedList.add(hero4);singleLinkedList.add(hero2);singleLinkedList.add(hero3);//显示一把singleLinkedList.list();}
}
此时的顺序是按照插入顺序来输入的,如何按照编号顺序来输出呢?
2.2 单链表按照顺序插入信息
需要按照编号的顺序添加
1.首先找到新添加的节点的位置,是通过辅助变量(指针),通过遍历来搞定
2.新的节点.next =temp.next
3.将temp.next=新的节点
//第二种方式在添加英雄时,根据排名将英雄插入到指定位置// (如果有这个排名,则添加失败,并给出提示)public void OrderAdd(HeroNode heroNode){//因为头结点不能动,因此我们仍然通过一个辅助指针(变量)来帮助找到添加的位置//因为单链表,因为我们找的temp是位于添加位置的前一个结点,否则插入不了HeroNode temp=head;//如果temp.next==null,说明temp已经在链表的最后,说明添加的结点就是位于链表的最后while(temp.next!=null){//位置找到,就在temp的后边if(temp.next.no>heroNode.no){break ;}else if(temp.next.no==heroNode.no){//不能添加,说明编号存在System.out.println("准备插入的英雄的编号已经存在,不能加入");return;}temp=temp.next; //遍历当前链表}heroNode.next=temp.next;temp.next=heroNode;return;}
//先创建结点
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.OrderAdd(hero1);
singleLinkedList.OrderAdd(hero4);
singleLinkedList.OrderAdd(hero2);
singleLinkedList.OrderAdd(hero3);
2.3 单链表结点的修改
//修改结点的信息,根据no编号来修改,即no编号不能改//说明:1.根据newHeroNode的no来修改public void update(HeroNode newHeroNode){//判断是否空if(head.next==null){System.out.println("链表为空");return;}//找到需要修改的结点,根据no编号//定义一个辅助变量HeroNode temp=head.next;while(temp!=null){if(temp.no==newHeroNode.no){System.out.println("找到了");temp.nickname=newHeroNode.nickname;temp.name=newHeroNode.name;return;}temp=temp.next;}//已经遍历完链表,但是还没找到System.out.printf("没有找到编号%d的结点",newHeroNode.no);}
//先创建结点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.OrderAdd(hero1);singleLinkedList.OrderAdd(hero4);singleLinkedList.OrderAdd(hero2);singleLinkedList.OrderAdd(hero3);//测试修改结点的代码HeroNode newHeroNode=new HeroNode(2,"小卢","玉麒麟~~");singleLinkedList.update(newHeroNode);
2.4 单链表结点的删除
从单链表中删除一个节点的思路
1.我们先找到需要删除的这个节点的前一个节点temp
2. temp.next = temp.next.next
3.被删除的节点,将不会有其它引用指向,会被垃圾回收机制回收
//删除结点//思路//1.head不动,因此我们需要一个temp辅助结点找到待删除结点的前一个结点//2.说明我们在比较时,是temp.next.no和需要删除的结点的no进行比较public void delete(int no){HeroNode temp=head;//当遍历到链表的最后,就必须退出了while(temp.next!=null){//注意,我们要找的是待删除结点的前一个结点if(temp.next.no==no){temp.next=temp.next.next; //删除结点return ;}temp=temp.next; //后移才能实现遍历}//说明一直都没有找到System.out.printf("没有找到指定的要删除的编号为%d\n",no);}
//测试删除结点singleLinkedList.list();singleLinkedList.delete(3);System.out.println("删除后");//显示一把singleLinkedList.list();
3.大厂面试题
3.1.查找单链表中的倒数第k个结点(新浪面试题)
链表中倒数第k个结点
3.2.单链表的反转(腾讯面试题)
反转链表
3.3.从尾到头打印单链表(百度面试题)
从尾到头打印链表
单链表算法设计(含大厂面试题)相关推荐
- 线性表11|单链表小结:腾讯面试题 - 数据结构和算法16
线性表11|单链表小结:腾讯面试题 让编程改变世界 Change the world by program 静态链表的删除操作 我们的故事还没结束,小C看到小A和2B这样非法的勾当,内心觉得很不爽,一 ...
- c语言递增20,2020-07-20(C语言)数据结构-在一个递增有序的线性表中,有数值相同的元素存在。若存储方式为单链表,设计算法去掉数值相同的元素,使表中不再有重复的元素...
//在一个递增有序的线性表中,有数值相同的元素存在.若存储方式为单链表,设计算法去掉数值相同的元素,使表中不再有重复的元素,例如:(7,10,10,21,30,42,42,51,70)将变为(7,10 ...
- 在一个递增有序的线性表中,有数值相同的元素存在。若存储方式为单链表,设计算法,去掉数值相同的元素,使得表中不再有重复的元素。
在一个递增有序的线性表中,有数值相同的元素存在.若存储方式为单链表,设计算法,去掉数值相同的元素,使得表中不再有重复的元素.例如(7,10,10,21,30,42,42,42,51,70)将变为(7, ...
- Θ(n)反转单链表(算法导论第三版第十章10.2-7)
Θ(n)反转单链表 (算法导论第三版第十章10.2-7) template<typename T> void reverses(Single_L<T> &l) {if( ...
- 数据结构上机实践第四周项目2 - 建设“单链表”算法库
项目2 - 建设"单链表"算法库 本次实践的目的以多文件组织的形式建设"单链表算法库",以便在后续的工程中使用. 文中的多文件组织方式不再细说,可以点击此处参照 ...
- (关于单链表的真题)已知一个带有表头结点的单链表...请设计一个尽可能高效的算法,查找链表中倒数第k个位置的结点。
真题描述 已知一个带有表头结点的单链表,结点结构为 data next 假设该链表只给出了头指针head.在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k个位置上的结点. 若查找成 ...
- 计算机算法设计与分析期末试题,算法设计与分析期末考试试卷(D卷)(含答案).doc...
算法设计与分析期末考试试卷(D卷) 一.选择题(0分,每题分) .D A.n2/2 + 2n的渐进表达式上界函数是O(2n) B.n2/2 + 2n的渐进表达式下界函数是Ω(2n) C.logn3的渐 ...
- java实现单链表常见操作,java面试题,java初级笔试题
写在最前面,我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家.扫码加微信好友进[程序员面试学习交流群],免费领取.也欢迎各位一起在群里探讨技术. 一. ...
- 数据结构基础(8) --单链表的设计与实现(1)之基本操作
链表简介 数组的缺点: 1.元素插入:除了在数组的末尾插入元素之外,在数组的其他任何位置插入元素都需要进行数组元素的频繁移动(插入位置之后的元素都需往后移动), 时间复杂度约为O(N); 2.数组的删 ...
最新文章
- zbb20170613 linux 安装 mysql
- 【PC工具】更新github下载加速器,github项目辅助下载工具,github高速下载
- Lucene的评分(score)机制研究
- C高级第一次PTA作业(2)
- oracle取某时间段的数据
- python把数字逐一存入列表_python实现将range()函数生成的数字存储在一个列表中...
- 卡尔曼滤波器实例:进一步讨论自由落体运动
- java技术栈_七天串起java技术栈-开篇
- 【java学习之路】(javaWeb篇)008.VUE
- 如何在内存中存储有序数据?
- c语言如何框出视频或图像中的车辆,视频图像中的车辆检测跟踪和分类
- 不定积分/定积分——三角函数n次方不定积分公式(包含sec^nx与csc^nx不定积分公式)
- matlab光学应用实践,Matlab在光学信息处理仿真实验中的应用
- 年后跳槽,你准备好在编程面试中一举拿下高薪了吗?
- 街头篮球Android和苹果,街头篮球手游ios和安卓数据可以互通吗?
- Polygon与以太坊通信机制研究
- 模拟赛 Jams倒酒
- C# 高并发获取唯一ID算法
- 20道大厂真实面试题,答出一半以上的都是高手
- 描述对未来计算机的畅想用英语作文,畅想未来人工智能的发展状况英语作文 关于畅想未来人工智能的发展状况的英语作文...
热门文章
- 人缘还挺好!史玉柱:被人网上恶搞 马云等十几人打电话来慰问我
- 前端面试题汇总(jQuery)
- BMP图片读写接口函数
- java 异常处理 简书_Java基础知识8-异常处理
- 【Flink】FLink Assigned key must not be null
- 【算法】剑指 Offer 36. 二叉搜索树与双向链表
- 【算法】弗洛伊德算法 最短路径算法
- 【Kafka】kafka This may indicate that authentication failed due to invalid credentials
- 50-00-010-配置-kylin-2.6.0官网配置
- 95-120-042-源码-Cluster-SessionClusterEntrypoint