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

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

代码实现:

节点类

public class HeroNode {

    protected Integer no;
protected String name;
protected HeroNode next; public HeroNode(Integer no, String name) {
this.no = no;
this.name = name;
} @Override
public String toString() {
return "HeroNode[" +
"no=" + no +
", name='" + name + '\'' +
']';
}
}

SingleLinkedList

public class SingleLinkedList {

    private HeroNode root;
private Integer size = 0; /**
* 添加至链表头
* @param hero
*/
public void addFirst(HeroNode hero) {
if (root == null) {
root = hero;
} else {
hero.next = root;
root = hero;
}
size++;
} /**
* 添加至链表尾
* @param hero
*/
public void addLast(HeroNode hero) {
if (root == null) {
root = hero;
} else {
HeroNode temp = root;
while (temp.next != null) {
temp = temp.next;
}
temp.next = hero;
}
size++;
} /**
* 按照某属性的顺序添加
* @param hero
*/
public void addByOrder(HeroNode hero) {
if (root == null) {
root = hero; } else {
HeroNode tmp = root;
// 新节点比头节点小
if (hero.no < tmp.no) {
root = hero;
root.next = tmp;
return;
}
// 找到next节点编号大于等于新节点的编号的节点,该节点与它的next节点之间就是新节点所在位置,
// 等于时不添加,控制台进行提示
while (tmp.next != null && tmp.next.no < hero.no) {
tmp = tmp.next;
}
if (tmp.next == null) {
tmp.next = hero;
return;
} if (tmp.next.no.equals(hero.no)) {
System.out.println("编号为" + hero.no + "已存在");
return;
}
hero.next = tmp.next;
tmp.next = hero;
}
size++;
} /**
* 修改
* @param hero
*/
public void modify(HeroNode hero) {
HeroNode tmp = root;
while(tmp !=null) {
if (tmp.no.equals(hero.no)) {
tmp.name = hero.name;
break;
}
tmp = tmp.next;
}
} /**
* 根据编号获取节点
* @param no
* @return
*/
public HeroNode query(int no) {
HeroNode tmp = root;
while (tmp != null) {
if (tmp.no.equals(no)) {
return tmp;
}
tmp = tmp.next;
}
return null;
} /**
* 根据编号删除节点
* @param no
*/
public void remove(int no) {
if (root == null) {
return;
}
//根节点
if (no == root.no) {
if (null != root.next) {
root = root.next;
} else {
root = null;
}
size--;
return;
} // 非根节点
HeroNode temp = root;
while (temp.next != null) {
if (no == temp.next.no) {
break;
}
temp = temp.next;
}
// 节点不存在
if (temp.next == null) {
return;
}
temp.next = temp.next.next;
size--;
} /**
* 打印
*/
public void display() {
if (root == null) {
System.out.println("This SingleLinkedList is null.");
return;
}
HeroNode temp = root;
while(temp != null) {
System.out.println(temp.toString());
temp = temp.next;
}
} /**
* 获取链表长度
* @return
*/
public Integer getSize() {
return size;
}
}

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. linux mint 安装微信

    安装nodejs 到nodejs官网下载node js压缩包,然后解压到自己设置的目录.我的解压路径是 /home/congwiny/Develop/SoftWare/node-v6.10.3-lin ...

  2. PHP之50个开源项目

    GitHub上50个最受欢迎的PHP开源项目[2019] 1.Laravel Laravel是一个为Web开发者打造的PHP开发框架. GitHub Stars: 43.5k+ 网址: https:/ ...

  3. es6的学习

    前端语言真的是比较多,尤其是做项目的时候,为了节约项目开发时间,框架选型一般选择比较成熟的,上手比较快捷的.目前领域里比较火的是vue,angular,以及react.为了逼迫自己好好学习.先从vue ...

  4. 实现div可以调整高度(div实现resize)

    实现div可以调整高度(div实现resize) 一.div 实现resize(类似textarea) 代码如下: <!DOCTYPE html> <html> <hea ...

  5. 测试使用Timer定时调用http接口

    转自:https://blog.csdn.net/qq_36004521/article/details/80101881

  6. css and canvas实现圆形进度条

    进度条效果:   话不多说,上代码 使用css动画实现,看到一篇博客的启发,稍微修改了下, css实现的原理是用两个半圆一开始隐藏,再分别旋转180度,最后成为一个整圆 半圆效果,一开始右边的半圆在盒 ...

  7. 如何解决Win10系统更新显示0x80080300代码的错误?

    Win10系统自推出以来就不断的在完善更新,其越来越丰富的功能也吸引了越来越多的用户.好系统Win10系统:https://www.vkebao.com/os/index_2.html但最近有用户反映 ...

  8. 《浏览器工作原理与实践》<01>Chrome架构:仅仅打开了1个页面,为什么有4个进程?

    无论你是想要设计高性能 Web 应用,还是要优化现有的 Web 应用,你都需要了解浏览器中的网络流程.页面渲染过程,JavaScript 执行流程,以及 Web 安全理论,而这些功能是分散在浏览器的各 ...

  9. deep_learning_Function_numpy_random.normal()

    numpy常用函数之random.normal函数 np.random.normal(loc=0.0, scale=1.0, size=None) 作用:   生成高斯分布的概率密度随机数 loc:f ...

  10. idea 下gradle创建springboot 项目

    InterlijIdea 开发环境下创建基于springBoot的项目. 环境 1.jdk1.5以上 2.interlijidea 15 以上 步骤 1.File –>new –>Proj ...