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 ...
随机推荐
- python增量爬虫
import pymysql def insert_db(db_table, issue, time_str, num_code): host = '127.0.0.1' user = 'root' ...
- cookie以一个或多个空格开头
作为一个整体,如果cookie以一个或多个空格开头,请用空格替换所有空格:如果cookie以一个或多个空格结尾,请用空格替换所有空格. 象征意义: \ S:空间,空间 +一个或多个 ^开始,^s,以空 ...
- js把一串字符串去重(能统计出字符重复次数更佳)
原文来自:https://juejin.im/post/5ba6e77e6fb9a05d0b14359b <script> let str = "12qwe345671dsfa2 ...
- Hadoop2.7.3集群安装scala-2.12.8 和spark2.7
Apache Spark™是用于大规模数据处理的统一分析引擎. 从右侧最后一条新闻看,Spark也用于AI人工智能 spark是一个实现快速通用的集群计算平台.它是由加州大学伯克利分校AMP实验室 开 ...
- ETL 工具和 BI 工具
ETL是数据仓库中的非常重要的一环,是承前启后的必要的一步.ETL负责将分布的.异构数据源中的数据如关系数据.平面数据文件等抽取到临时中间层后进行清洗.转换.集成,最后加载到数据仓库或数据集市中,成为 ...
- 中断或取消Promise链的可行方案
ES6标准引入的异步编程解决方案Promise,能够将层层嵌套的回调转化成扁平的Promise链式调用,优雅地解决了“回调地狱”的问题.当Promise链中抛出一个错误时,错误信息沿着链路向后传递,直 ...
- HttpClient 源码阅读
在项目中常用的HttpClient,与我们非常的亲密,为了能处理遇到的Http问题,我们应该去了解里面的机制和实现. 官方文档:http://hc.apache.org/httpcomponents- ...
- CentOS7磁盘空间不足,却找不到占用空间的大文件
1 df -ah 显示/根目录占用百分之九十 进入根目录对指定的文件夹查询容量 cd / du -sh * | sort -n 磁盘有50G,加起来有10G左右的文件找不到 2 自己影响中,已经清理 ...
- 第八章· Redis API 开发
Redis 开发 1.源码安装Python环境 Python官网:https://www.python.org/ #下载Python3.6.4安装包 [root@db03 ~]# wget https ...
- 单节点FastDFS与Nginx部署
一.安装基本组件 1.安装编译需要的组件,必安装组件. yum install gcc-c++ 2.安装libevent函数库.pcre-devel zlib-devel必安装组件. yum ...