目录

  • 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.从尾到头打印单链表(百度面试题)

从尾到头打印链表

单链表算法设计(含大厂面试题)相关推荐

  1. 线性表11|单链表小结:腾讯面试题 - 数据结构和算法16

    线性表11|单链表小结:腾讯面试题 让编程改变世界 Change the world by program 静态链表的删除操作 我们的故事还没结束,小C看到小A和2B这样非法的勾当,内心觉得很不爽,一 ...

  2. c语言递增20,2020-07-20(C语言)数据结构-在一个递增有序的线性表中,有数值相同的元素存在。若存储方式为单链表,设计算法去掉数值相同的元素,使表中不再有重复的元素...

    //在一个递增有序的线性表中,有数值相同的元素存在.若存储方式为单链表,设计算法去掉数值相同的元素,使表中不再有重复的元素,例如:(7,10,10,21,30,42,42,51,70)将变为(7,10 ...

  3. 在一个递增有序的线性表中,有数值相同的元素存在。若存储方式为单链表,设计算法,去掉数值相同的元素,使得表中不再有重复的元素。

    在一个递增有序的线性表中,有数值相同的元素存在.若存储方式为单链表,设计算法,去掉数值相同的元素,使得表中不再有重复的元素.例如(7,10,10,21,30,42,42,42,51,70)将变为(7, ...

  4. Θ(n)反转单链表(算法导论第三版第十章10.2-7)

    Θ(n)反转单链表 (算法导论第三版第十章10.2-7) template<typename T> void reverses(Single_L<T> &l) {if( ...

  5. 数据结构上机实践第四周项目2 - 建设“单链表”算法库

    项目2 - 建设"单链表"算法库 本次实践的目的以多文件组织的形式建设"单链表算法库",以便在后续的工程中使用. 文中的多文件组织方式不再细说,可以点击此处参照 ...

  6. (关于单链表的真题)已知一个带有表头结点的单链表...请设计一个尽可能高效的算法,查找链表中倒数第k个位置的结点。

    真题描述 已知一个带有表头结点的单链表,结点结构为 data next 假设该链表只给出了头指针head.在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k个位置上的结点. 若查找成 ...

  7. 计算机算法设计与分析期末试题,算法设计与分析期末考试试卷(D卷)(含答案).doc...

    算法设计与分析期末考试试卷(D卷) 一.选择题(0分,每题分) .D A.n2/2 + 2n的渐进表达式上界函数是O(2n) B.n2/2 + 2n的渐进表达式下界函数是Ω(2n) C.logn3的渐 ...

  8. java实现单链表常见操作,java面试题,java初级笔试题

    写在最前面,我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家.扫码加微信好友进[程序员面试学习交流群],免费领取.也欢迎各位一起在群里探讨技术. 一. ...

  9. 数据结构基础(8) --单链表的设计与实现(1)之基本操作

    链表简介 数组的缺点: 1.元素插入:除了在数组的末尾插入元素之外,在数组的其他任何位置插入元素都需要进行数组元素的频繁移动(插入位置之后的元素都需往后移动), 时间复杂度约为O(N); 2.数组的删 ...

最新文章

  1. zbb20170613 linux 安装 mysql
  2. 【PC工具】更新github下载加速器,github项目辅助下载工具,github高速下载
  3. Lucene的评分(score)机制研究
  4. C高级第一次PTA作业(2)
  5. oracle取某时间段的数据
  6. python把数字逐一存入列表_python实现将range()函数生成的数字存储在一个列表中...
  7. 卡尔曼滤波器实例:进一步讨论自由落体运动
  8. java技术栈_七天串起java技术栈-开篇
  9. 【java学习之路】(javaWeb篇)008.VUE
  10. 如何在内存中存储有序数据?
  11. c语言如何框出视频或图像中的车辆,视频图像中的车辆检测跟踪和分类
  12. 不定积分/定积分——三角函数n次方不定积分公式(包含sec^nx与csc^nx不定积分公式)
  13. matlab光学应用实践,Matlab在光学信息处理仿真实验中的应用
  14. 年后跳槽,你准备好在编程面试中一举拿下高薪了吗?
  15. 街头篮球Android和苹果,街头篮球手游ios和安卓数据可以互通吗?
  16. Polygon与以太坊通信机制研究
  17. 模拟赛 Jams倒酒
  18. C# 高并发获取唯一ID算法
  19. 20道大厂真实面试题,答出一半以上的都是高手
  20. 描述对未来计算机的畅想用英语作文,畅想未来人工智能的发展状况英语作文 关于畅想未来人工智能的发展状况的英语作文...

热门文章

  1. 人缘还挺好!史玉柱:被人网上恶搞 马云等十几人打电话来慰问我
  2. 前端面试题汇总(jQuery)
  3. BMP图片读写接口函数
  4. java 异常处理 简书_Java基础知识8-异常处理
  5. 【Flink】FLink Assigned key must not be null
  6. 【算法】剑指 Offer 36. 二叉搜索树与双向链表
  7. 【算法】弗洛伊德算法 最短路径算法
  8. 【Kafka】kafka This may indicate that authentication failed due to invalid credentials
  9. 50-00-010-配置-kylin-2.6.0官网配置
  10. 95-120-042-源码-Cluster-SessionClusterEntrypoint