1.概述

单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始;链表是使用指针进行构造的列表;又称为结点列表,因为链表是由一个个结点组装起来的;其中每个结点都有指针成员变量指向列表中的下一个结点;

​ 链表是由结点构成,head指针指向第一个成为表头结点,而终止于最后一个指向NULL的指针。 ​

2.单向链表结构

  • 存储多个元素,另外一个选择就是使用链表。

  • 链表是以节点的方式存储数据

  • 不同于数组,链表中的元素在内存中不必是连续的空间。

  • 链表的每个元素由一个存储元素本身的节点和一个指向下一个元素的引用(有些语言称为指针)组成。

地址 data域 next域
0x0000(head) null 0x3344
0x3344 12 0x5673
0x4399 76 0x9436
0x5673 23 0x4399
0x9436 47 null

3.单向链表逻辑结构

4.单向链表的优点

(1)单个结点创建非常方便,普通的线性内存通常在创建的时候就需要设定数据的大小

(2)结点的删除非常方便,不需要像线性结构那样移动剩下的数据

(3)结点的访问方便,可以通过循环或者递归的方法访问到任意数据,但是平均的访问效率低于线性表

5.单向链表缺点

(1)只能从头到尾遍历。只能找到后继,无法找到前驱,也就是只能前进。

(2)在进行查询时,搜索一个节点需要遍历链表,在情况不好的情况下可能下需要到链表尾才能找到。

(3)链表需要多维护一个next的域,占据了更多的内存

6.java代码实现单向链表

    @Testpublic void test13() {LinkedList linkedList = new LinkedList();
//        Scanner scanner = new Scanner(System.in);Person person = new Person(1, "才是");Person person2 = new Person(2, "wd");
//        String s = scanner.next();linkedList.addNode(person);linkedList.addNode(person2);linkedList.list();linkedList.updateNode(new Person(2,"是的"));linkedList.list();linkedList.deleteNode(person2);linkedList.list();}@Dataclass Person {private Integer personNo;//编号private String personName;//名字private Person next;//下一个结点public Person(Integer personNo, String personName, Person next) {this.personNo = personNo;this.personName = personName;this.next = next;}public Person(int personNo, String personName) {this.personNo = personNo;this.personName = personName;}@Overridepublic String toString() {return "Person{" +"personNo=" + personNo +", personName='" + personName + '\'' +'}';}}class LinkedList {private Person head;//头结点private Person last;//尾结点private int length;//节点的位置public LinkedList() {head = new Person(0, "", null);last = new Person(0, "", null);length = 0;}public LinkedList(Person head, Person last) {this.head = head;this.last = last;}public void addNode(Person person) {Person temp = head;while (true) {if (temp.next == null) {break;}temp = temp.next;}temp.next = person;System.out.println("添加结点成功"+person);}public void deleteNode(Person person) {Person temp = head;boolean blag=false;while (true) {if (temp.next == null) {break;}if (temp.next.personNo == person.personNo) {blag=true;break;}temp = temp.next;}if (blag){temp.next = temp.next.next;System.out.println("删除结点成功"+person);}else {System.out.println("没有找到删除的结点");}}public void list(){Person temp =head;while (true){if (temp.next!=null){System.out.println(temp.next);}else {break;}temp=temp.next;}}public void updateNode(Person person){Person temp = head;boolean blag=false;while (true){if (temp.next.personNo==person.personNo){blag=true;break;}if (temp.next==null){break;}temp=temp.next;}if (blag){temp.next.personNo=person.personNo;temp.next.personName=person.personName;System.out.println("修改结点成功");}else {System.out.println("未找到改结点");}}}

java单向链表详解相关推荐

  1. java数据结构-链表详解

    文章目录 1.数据结构-链表详解 1.1单链表 1.1.1单链表节点的尾部添加 1.1.2单链表节点的自动排序添加 1.1.3单链表节点的修改 1.1.4单链表节点的删除 1.2单链表面试题 1.2. ...

  2. Java中LinkedList详解

    Java中LinkedList详解 LinkedList底层是双向链表 单向链表 双向链表 LinkedList新增的方法 主要增加了针对头结点与尾结点进行操作的方法, 即针对第一个元素和最后一个元素 ...

  3. java多线程学习-java.util.concurrent详解

    http://janeky.iteye.com/category/124727 java多线程学习-java.util.concurrent详解(一) Latch/Barrier 博客分类: java ...

  4. JavaScript数据结构与算法——链表详解(下)

    在JavaScript数据结构与算法--链表详解(上)中,我们探讨了一下链表的定义.实现原理以及单链表的实现.接下来我们进一步了解一下链表的其他内容. 1.双向链表 双向链表实现原理图: 与单向链表不 ...

  5. JavaScript数据结构与算法——链表详解(上)

    注:与之前JavaScript数据结构与算法系列博客不同的是,从这篇开始,此系列博客采用es6语法编写,这样在学数据结构的同时还能对ECMAScript6有进一步的认识,如需先了解es6语法请浏览ht ...

  6. java IO编程详解

    java IO编程详解 一.Socket 1. Sock概述 Socket,套接字就是两台主机之间逻辑连接的端点.TCP/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP协议是应用层协议 ...

  7. java常用集合详解

    文章目录 一.常用集合大纲 1.常用集合框架及介绍 2.集合和数组的区别 二.Collection 集合(接口) 三.List集合(接口) 1.存储遍历方式 2.ArrayList(实现类) 3.Li ...

  8. C语言结构体与指针ppt,c语言指针和结构体:链表详解.ppt

    c语言指针和结构体:链表详解.ppt 1,第十一章 链表,2,例跳马.依下图将每一步跳马之后的位置x,y放到一个"结点"里,再用"链子穿起来",形成一条链,相邻 ...

  9. 数据结构之链表详解(2)——双向链表

    目录 前言 一.双向链表 A.双向链表的含义 B.双向链表的实现 1.双向链表的结构 2.链表的初始化 初始化图解: 函数代码: 3.动态申请节点函数 函数代码: 4.打印双向链表函数 函数代码: 5 ...

最新文章

  1. Cocos2dx游戏开发系列笔记6:怎样让《萝莉快跑》的例子运行在vs和手机上
  2. eclipse主题颜色配置
  3. 1012: [JSOI2008]最大数maxnumber
  4. android 介绍0
  5. 不会吸引人的JavaDocs源样本
  6. 前端学习(1306):node.js模块的加载机制
  7. python 网络框架twisted基础学习及详细讲解
  8. 信息学奥赛一本通 2047:【例5.16】过滤空格 | OpenJudge NOI 1.7 23:过滤多余的空格
  9. Code-NFine:变量修改
  10. 动态库静态库的链接过程
  11. word文档保护密码忘 了,怎么取消格式和编辑保护
  12. ckeditor实战总结
  13. 程序员的自我修养_之四_曾国藩是如何脱胎换骨的
  14. 交互体验设计优秀的产品
  15. group by 和 having 用法
  16. 网易邮箱大师如何注册邮箱 注册邮箱方法步骤介绍
  17. 共建“医疗合规科技实验室”,美创科技实力护航医疗数据安全
  18. 一个简单的Spark ML的例子
  19. 学会记忆--学会遗忘
  20. Mobius函数(模板)

热门文章

  1. C/C++用宏定义函数
  2. 2020,我离开了魔都
  3. 贝叶斯公式的理解(先验概率/后验概率)
  4. [AHK]玩转idMSO为Office软件任意增加热键
  5. C语言中阶第四篇:分支与循环语句练习,求阶乘的多种方法(两层for循环求阶乘)、二分查找、字符串汇聚以及模拟用户登录
  6. RabbitMQ 之延时队列使用场景
  7. ToDesk企业版上新 | 十大新功能,让企业远控更安全、更便捷、更流畅
  8. 如何在代码中应用设计模式
  9. C++ 中的分号 语句块
  10. web视频剪辑 在线视频编辑 开发类似:VE视频引擎 美摄sdk VESDK 蓝松短视频SDK 筷子saas剪辑 系统源码