Java - 单链表
链表是一种常见的基础数据结构,是一种有序的列表,但不会按照线性顺序存储数据,而是在每一个节点里存储下一个节点的指针(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 - 单链表的更多相关文章
- Java单链表反转 详细过程
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/guyuealian/article/details/51119499 Java单链表反转 Java实 ...
- java 单链表 练习
练习一下java单链表的简单习题 package com.test1; import java.util.Stack; public class SingleListDemo { /** * 返回单链 ...
- Java单链表反转图文详解
Java单链表反转图文详解 最近在回顾链表反转问题中,突然有一些新的发现和收获,特此整理一下,与大家分享 背景回顾 单链表的存储结构如图: 数据域存放数据元素,指针域存放后继结点地址 我们以一条 N1 ...
- java单链表代码实现
用惯了C++,java写起来果然不太爽...不废话了,上代码... package javaInnerclassDemo; class Link{ class Node{ private String ...
- java单链表常用操作
总结提高,与君共勉 概述. 数据结构与算法亘古不变的主题,链表也是面试常考的问题,特别是手写代码常常出现,将从以下方面做个小结 [链表个数] [反转链表-循环] [反转链表-递归] [查找链表倒数第K ...
- JAVA单链表的实现-不带头结点但带有尾指针
1,本程序实现了线性表的链式存储结构.实现的链表带有两个指针,一个始终指向链表中的第一个结点,另一个指针始终指向链表中的最后一个结点. 之所以设置尾指针,是因为,在插入元素到链表中的末尾时,可以通过尾 ...
- JAVA单链表的实现-不带头结点且没有尾指针
本程序采用JAVA语言实现了线性表的链式实现.首先定义了线性表的接口ListInterface,然后LList类实现了ListInterface完成了链表的实现. 本实现中,链表是不带表头结点的,且有 ...
- Java单链表简单实现* @version 1.0
package com.list; /** * 数据结构与算法Java表示 * @version 1.0 * @author 小明 * */ public class MyLinkedList { p ...
- java 单链表反转
最近与人瞎聊,聊到各大厂的面试题,其中有一个就是用java实现单链表反转.闲来无事,决定就这个问题进行一番尝试. 1.准备链表 准备一个由DataNode组成的单向链表,DataNode如下: pub ...
- Java单链表、双端链表、有序链表实现
单链表: insertFirst:在表头插入一个新的链接点,时间复杂度为O(1) deleteFirst:删除表头的链接点,时间复杂度为O(1) 有了这两个方法,就可以用单链表来实现一个栈了,见htt ...
随机推荐
- webpack提取公共js代码
webpack打包js代码与提取公共js代码分析 webpack提取公共js代码示例 一.分析 webpack默认打包js代码时,是将从入口js模块开始,将入口js模块所依赖的js以及模块逐层依赖的模 ...
- Excel中把图片合并进图表的方法介绍
方法一: 使用“图案”对话框 双击某个数据系列,选择“图案”标签,单击“填充效果”按钮,在“填充效果”对话框中选择“图片”标签,单击“选择图片”按钮,选择一个要使用的图形文件即可. 方法二: 使用剪贴 ...
- 阿里云 elasticsearch 增删改查
kibana 控制台 # 查询所有数据 GET /yixiurds_dev/_search { "query": { "match_all": { } } } ...
- latex中文环境配置(针对北大模板,开题报告+中期答辩+毕业论文)
最近自己在忙着开题,中文环境真的是emm 以下只针对北大的毕业论文模板,至于其他的中文环境没有尝试 主要是用不同的latex编辑器会报不同的错误,当然我最后还是统一成了pdflatex,经过无数次尝试 ...
- 利用 Monitor.TryEnter 来规避 .NET 线程死锁的源代码
在开发多线程的应用程序时,我们会大量用到 lock (...) {} 块.如果 lock 的对象比较多,非常容易发生死锁.死锁的发生很难预料,而且一旦发生在界面线程上,界面就不再刷新响和应用户输入:如 ...
- 微服务之Nacos配置中心源码解析(二)
Nacos配置中心源码解析 源码入口 ConfigFactory.createConfigService ConfigService configService = NacosFactory.crea ...
- mysql数据库: 用户管理、pymysql使用、navicat插件使用
一.用户管理 二.pymysql增删改查 三.sql注入攻击 一.用户管理 数据安全非常重要 不可能随便分配root账户 应该按照不同开发岗位分配不同的账户和权限 mysql中 将于用户相关的数据放在 ...
- Linux用户组管理及用户权限3
用户.组管理命令 安全上下文: 进程以其发起者的身份运行: 进程对文件的访问权限,取决于发此进程的用户的权限 系统用户:为了能够让那些后台进程或服务类进程以非管理员 ...
- 解决remix在线编译器连接本地私有链环境不成功的问题
一.部署合约到私有链环境 选择"environment"里的"Web3 Provider" 弹出RPC连接地址输入框 输入我们Geth客户端安装服务器的IP:9 ...
- Hdu 1851 Nim+巴什博弈
写出SG表 发现SG函数规律为Mi%(Li+1) #include<bits/stdc++.h> using namespace std; int main() { int t; cin ...