链表是一种常见的基础数据结构,是一种有序的列表,但不会按照线性顺序存储数据,而是在每一个节点里存储下一个节点的指针(next)。链表适合插入、删除,不宜过长,否则会导致遍历性能下降。

  • 以节点方式存储;
  • 每个节点包含data域,next域:指向下一个节点;
  • 链表的各个节点不一定是连续存储的;

代码实现:

节点类

  1. public class HeroNode {
  2.  
  3. protected Integer no;
  4. protected String name;
  5. protected HeroNode next;
  6.  
  7. public HeroNode(Integer no, String name) {
  8. this.no = no;
  9. this.name = name;
  10. }
  11.  
  12. @Override
  13. public String toString() {
  14. return "HeroNode[" +
  15. "no=" + no +
  16. ", name='" + name + '\'' +
  17. ']';
  18. }
  19. }

SingleLinkedList

  1. public class SingleLinkedList {
  2.  
  3. private HeroNode root;
  4. private Integer size = 0;
  5.  
  6. /**
  7. * 添加至链表头
  8. * @param hero
  9. */
  10. public void addFirst(HeroNode hero) {
  11. if (root == null) {
  12. root = hero;
  13. } else {
  14. hero.next = root;
  15. root = hero;
  16. }
  17. size++;
  18. }
  19.  
  20. /**
  21. * 添加至链表尾
  22. * @param hero
  23. */
  24. public void addLast(HeroNode hero) {
  25. if (root == null) {
  26. root = hero;
  27. } else {
  28. HeroNode temp = root;
  29. while (temp.next != null) {
  30. temp = temp.next;
  31. }
  32. temp.next = hero;
  33. }
  34. size++;
  35. }
  36.  
  37. /**
  38. * 按照某属性的顺序添加
  39. * @param hero
  40. */
  41. public void addByOrder(HeroNode hero) {
  42. if (root == null) {
  43. root = hero;
  44.  
  45. } else {
  46. HeroNode tmp = root;
  47. // 新节点比头节点小
  48. if (hero.no < tmp.no) {
  49. root = hero;
  50. root.next = tmp;
  51. return;
  52. }
  53. // 找到next节点编号大于等于新节点的编号的节点,该节点与它的next节点之间就是新节点所在位置,
  54. // 等于时不添加,控制台进行提示
  55. while (tmp.next != null && tmp.next.no < hero.no) {
  56. tmp = tmp.next;
  57. }
  58. if (tmp.next == null) {
  59. tmp.next = hero;
  60. return;
  61. }
  62.  
  63. if (tmp.next.no.equals(hero.no)) {
  64. System.out.println("编号为" + hero.no + "已存在");
  65. return;
  66. }
  67. hero.next = tmp.next;
  68. tmp.next = hero;
  69. }
  70. size++;
  71. }
  72.  
  73. /**
  74. * 修改
  75. * @param hero
  76. */
  77. public void modify(HeroNode hero) {
  78. HeroNode tmp = root;
  79. while(tmp !=null) {
  80. if (tmp.no.equals(hero.no)) {
  81. tmp.name = hero.name;
  82. break;
  83. }
  84. tmp = tmp.next;
  85. }
  86. }
  87.  
  88. /**
  89. * 根据编号获取节点
  90. * @param no
  91. * @return
  92. */
  93. public HeroNode query(int no) {
  94. HeroNode tmp = root;
  95. while (tmp != null) {
  96. if (tmp.no.equals(no)) {
  97. return tmp;
  98. }
  99. tmp = tmp.next;
  100. }
  101. return null;
  102. }
  103.  
  104. /**
  105. * 根据编号删除节点
  106. * @param no
  107. */
  108. public void remove(int no) {
  109. if (root == null) {
  110. return;
  111. }
  112. //根节点
  113. if (no == root.no) {
  114. if (null != root.next) {
  115. root = root.next;
  116. } else {
  117. root = null;
  118. }
  119. size--;
  120. return;
  121. }
  122.  
  123. // 非根节点
  124. HeroNode temp = root;
  125. while (temp.next != null) {
  126. if (no == temp.next.no) {
  127. break;
  128. }
  129. temp = temp.next;
  130. }
  131. // 节点不存在
  132. if (temp.next == null) {
  133. return;
  134. }
  135. temp.next = temp.next.next;
  136. size--;
  137. }
  138.  
  139. /**
  140. * 打印
  141. */
  142. public void display() {
  143. if (root == null) {
  144. System.out.println("This SingleLinkedList is null.");
  145. return;
  146. }
  147. HeroNode temp = root;
  148. while(temp != null) {
  149. System.out.println(temp.toString());
  150. temp = temp.next;
  151. }
  152. }
  153.  
  154. /**
  155. * 获取链表长度
  156. * @return
  157. */
  158. public Integer getSize() {
  159. return size;
  160. }
  161. }

Java - 单链表的更多相关文章

  1. Java单链表反转 详细过程

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/guyuealian/article/details/51119499 Java单链表反转 Java实 ...

  2. java 单链表 练习

    练习一下java单链表的简单习题 package com.test1; import java.util.Stack; public class SingleListDemo { /** * 返回单链 ...

  3. Java单链表反转图文详解

    Java单链表反转图文详解 最近在回顾链表反转问题中,突然有一些新的发现和收获,特此整理一下,与大家分享 背景回顾 单链表的存储结构如图: 数据域存放数据元素,指针域存放后继结点地址 我们以一条 N1 ...

  4. java单链表代码实现

    用惯了C++,java写起来果然不太爽...不废话了,上代码... package javaInnerclassDemo; class Link{ class Node{ private String ...

  5. java单链表常用操作

    总结提高,与君共勉 概述. 数据结构与算法亘古不变的主题,链表也是面试常考的问题,特别是手写代码常常出现,将从以下方面做个小结 [链表个数] [反转链表-循环] [反转链表-递归] [查找链表倒数第K ...

  6. JAVA单链表的实现-不带头结点但带有尾指针

    1,本程序实现了线性表的链式存储结构.实现的链表带有两个指针,一个始终指向链表中的第一个结点,另一个指针始终指向链表中的最后一个结点. 之所以设置尾指针,是因为,在插入元素到链表中的末尾时,可以通过尾 ...

  7. JAVA单链表的实现-不带头结点且没有尾指针

    本程序采用JAVA语言实现了线性表的链式实现.首先定义了线性表的接口ListInterface,然后LList类实现了ListInterface完成了链表的实现. 本实现中,链表是不带表头结点的,且有 ...

  8. Java单链表简单实现* @version 1.0

    package com.list; /** * 数据结构与算法Java表示 * @version 1.0 * @author 小明 * */ public class MyLinkedList { p ...

  9. java 单链表反转

    最近与人瞎聊,聊到各大厂的面试题,其中有一个就是用java实现单链表反转.闲来无事,决定就这个问题进行一番尝试. 1.准备链表 准备一个由DataNode组成的单向链表,DataNode如下: pub ...

  10. Java单链表、双端链表、有序链表实现

    单链表: insertFirst:在表头插入一个新的链接点,时间复杂度为O(1) deleteFirst:删除表头的链接点,时间复杂度为O(1) 有了这两个方法,就可以用单链表来实现一个栈了,见htt ...

随机推荐

  1. python增量爬虫

    import pymysql def insert_db(db_table, issue, time_str, num_code): host = '127.0.0.1' user = 'root' ...

  2. cookie以一个或多个空格开头

    作为一个整体,如果cookie以一个或多个空格开头,请用空格替换所有空格:如果cookie以一个或多个空格结尾,请用空格替换所有空格. 象征意义: \ S:空间,空间 +一个或多个 ^开始,^s,以空 ...

  3. js把一串字符串去重(能统计出字符重复次数更佳)

    原文来自:https://juejin.im/post/5ba6e77e6fb9a05d0b14359b <script> let str = "12qwe345671dsfa2 ...

  4. Hadoop2.7.3集群安装scala-2.12.8 和spark2.7

    Apache Spark™是用于大规模数据处理的统一分析引擎. 从右侧最后一条新闻看,Spark也用于AI人工智能 spark是一个实现快速通用的集群计算平台.它是由加州大学伯克利分校AMP实验室 开 ...

  5. ETL 工具和 BI 工具

    ETL是数据仓库中的非常重要的一环,是承前启后的必要的一步.ETL负责将分布的.异构数据源中的数据如关系数据.平面数据文件等抽取到临时中间层后进行清洗.转换.集成,最后加载到数据仓库或数据集市中,成为 ...

  6. 中断或取消Promise链的可行方案

    ES6标准引入的异步编程解决方案Promise,能够将层层嵌套的回调转化成扁平的Promise链式调用,优雅地解决了“回调地狱”的问题.当Promise链中抛出一个错误时,错误信息沿着链路向后传递,直 ...

  7. HttpClient 源码阅读

    在项目中常用的HttpClient,与我们非常的亲密,为了能处理遇到的Http问题,我们应该去了解里面的机制和实现. 官方文档:http://hc.apache.org/httpcomponents- ...

  8. CentOS7磁盘空间不足,却找不到占用空间的大文件

    1 df -ah  显示/根目录占用百分之九十 进入根目录对指定的文件夹查询容量 cd / du -sh * | sort -n 磁盘有50G,加起来有10G左右的文件找不到 2 自己影响中,已经清理 ...

  9. 第八章· Redis API 开发

    Redis 开发 1.源码安装Python环境 Python官网:https://www.python.org/ #下载Python3.6.4安装包 [root@db03 ~]# wget https ...

  10. 单节点FastDFS与Nginx部署

    一.安装基本组件 1.安装编译需要的组件,必安装组件. yum install gcc-c++ 2.安装libevent函数库.pcre-devel zlib-devel必安装组件.     yum ...