数据结构之单链表(基于Java实现)
链表:在计算机中用一组任意的存储单元存储线性表的数据元素称为链式存储结构,这组存储结构可以是连续的,也可以是不连续的,因此在存储数据元素时可以动态分配内存。
注:在java中没有指针的概念,可以理解为对象的引用。
单链表的特点是链表的方向是单向的,对链表的访问要通过顺序读取,从头部开始。单链表是由一个个节点(Node)组装起来的,其中每个节点都由成员变量指向下一个节点。
特点概述:
每个节点由数据域和指针域组成
比顺序结构存储密度小。链式存储结构中每个节点都由数据域和指针域两部分组成,相比顺序结构增加了存储空间
逻辑上相邻的两个节点物理位置不必相邻
插入,删除灵活
查找节点时链式存储结构要比顺序结构慢
Java中链表的定义如下:
class Node<T>{
E data;
Node<E> next;
}
基于Java,来探究一下链表的原理:
首先,写一段简单的代码
public class Node <T>{
private T v;
Node<T> next;
public static void main(String[] args){
Node node3 = new Node();
node3.v = "a";
Node node2 = new Node();
node2.v = "b";
node2.next = node3;
Node node1 = new Node();
node1.v = "c";
node1.next = node2;
System.out.println(node1);
}
}
运行截图:
上述代码中,我们使node1的后继为node2,node2的后继为node3,更直观一点
下面,来看一下单链表的具体结构的实现:
public class SinglyLinkedList<E> {
private int size = 0;
private Node<E> first;
private Node<E> last;
public SinglyLinkedList(){
}
private static class Node<E>{
E data;
Node<E> next;
Node(E element,Node<E> next){
this.data = element;
this.next = next;
} }
public int size(){
return size;
}
public boolean isEmpty(){
return size() == 0;
}
public boolean contains(Object o){
if(o == null){
for(Node<E> x = first;x!=null;x = x.next){
if(x.data == null){
return true;
}
}
}else{
for(Node<E> x = first;x!=null;x = x.next){
if(o.equals(x.data)){
return true;
}
}
}
return false;
}
public boolean add(E e){
final Node<E> newNode = new Node<>(e,null);
final Node<E> l = last;
last = newNode;
if(l == null){
first = newNode;
last = newNode;
}else{
l.next = newNode;
}
size++;
return true; }
public E get(int index){
if(index < 0 || index > size - 1){
throw new IndexOutOfBoundsException("index " + index + "out of bounds");
}
Node<E> x = first;
for(int i = 0;i < index;i++){
x = x.next;
}
return x.data;
}
public E set(int index,E element){
if(index < 0 || index > size - 1){
throw new IndexOutOfBoundsException("index " + index + "out of bounds");
}
Node<E> x = first;
for(int i = 0; i< index; i++){
x = x.next;
}
E oldValue = x.data;
x.data = element;
return oldValue;
}
public E remove(int index){
if(index < 0 || index > size - 1){
throw new IndexOutOfBoundsException("index " + index + "out of bounds");
}
Node<E> x,p;
if(index == 0){
x = first;
first = first.next;
}else{
p = first;
for(int i = 0;i < index-1;i++){
p = p.next;
}
x = p.next;
p.next = x.next; }
final E element = x.data;
x.data = null;
size--;
return element;
}
public void addFirst(E e){
final Node<E> f = first;
final Node<E> newNode = new Node<>(e,null);
first = newNode;
if(f == null){
last = newNode;
}else{
newNode.next = f;
}
size++;
}
public void addLast(E e){
add(e);
}
}
public void addLast(E e){
add(e);
}
public E removeFirst(){
return remove(0);
}
public E removeLast(){
return remove(size-1);
}
方法说明:我们首先定义了链表的头节点和尾节点,为了方便我们后续的操作(比如判断链表是否为空等),然后定义链表的元素个数,这俩参考集合中.size()方法,
然后声明一个无参构造器,用来实例化;接着,定义链表的结构,很显然,这是一个内部类;因为Java中没有指针的概念,在这里Node<E> next表示引用的概念(地址);
一个单链表包含两部分,一部分数据域一部分指针域(个人叫法:引用域);
第一个方法,用来返回单链表中的元素个数;第二个方法用来查看链表是否为空;第三个方法查看链表是否包含某元素o;然后依次是增加元素,修改元素,删除元素等;
数据结构之单链表(基于Java实现)的更多相关文章
- 数据结构之单链表的实现-java
一.单链表基本概念 单链表是一种链式存取的数据结构,用一组地址任意的存储单元(一般是非连续存储单元)存放线性表中的数据元素.链表中的数据是以结点来表示的,每个结点的构成:元素data + 指针next ...
- 线性表概述及单链表的Java实现
一.线性表概述 线性表是指一组数据元素之间具有线性关系的元素序列,它表现为:除第一个元素没有直接前驱元素.最后一个元素没有直接后继元素外,其余所有元素都有且仅有一个直接前驱元素和直接后继元素. 根据存 ...
- Python数据结构之单链表
Python数据结构之单链表 单链表有后继结点,无前继结点. 以下实现: 创建单链表 打印单链表 获取单链表的长度 判断单链表是否为空 在单链表后插入数据 获取单链表指定位置的数据 获取单链表指定元素 ...
- javascript数据结构之单链表
下面是用javascript实现的单链表,但是在输出的时候insert方法中存在问题,chrome的console报错说不能读取空的属性,调试了很久都没有通过,先在这里存着,以后再来修改一下. //数 ...
- 数据结构(一) 单链表的实现-JAVA
数据结构还是很重要的,就算不是那种很牛逼的,但起码得知道基础的东西,这一系列就算是复习一下以前学过的数据结构和填补自己在这一块的知识的空缺.加油.珍惜校园中自由学习的时光.按照链表.栈.队列.排序.数 ...
- 数据结构(2):单链表学习使用java实现
单链表是单向链表,它指向一个位置: 单链表常用使用场景:根据序号排序,然后存储起来. 代码Demo: package com.Exercise.DataStructure_Algorithm.Sing ...
- Java数据结构之单链表
这篇文章主要讲解了通过java实现单链表的操作,一般我们开始学习链表的时候,都是使用C语言,C语言中我们可以通过结构体来定义节点,但是在Java中,我们没有结构体,我们使用的是通过类来定义我们所需要的 ...
- Java数据结构-03单链表(二)
在之前我们封装了一些操作在接口类中,并在抽象类实现了相同的方法.下面我们开始写代码: 无头结点单链表:(注意下面的AbstractList是之前抽取的类,不是java.util包下的类) public ...
- 图解Java数据结构之单链表
本篇文章介绍数据结构中的单链表. 链表(Linked List)介绍 链表可分为三类: 单链表 双向链表 循环列表 下面具体分析三个链表的应用. 单链表 链表是有序的列表,它在内存中存储方式如下: 虽 ...
随机推荐
- C#异步延迟Task.Delay
一. 1.Task.Delay实质是创建一个任务,再任务中开启一个定时间,然后延时指定的时间2.Task.Delay不和await一起使用情况,当代码遇到Task.Delay一句时,创建了了一个新的任 ...
- 2510-Druid监控功能的深入使用与配置-基于SpringBoot-完全使用java config的形式
环境 springboot 1.5.9.RELEASE + JDK1.8 配置步骤 分两步,1 配置数据源 2 配置监控 直接上代码 1 配置数据源 package com.company.proje ...
- SpringBoot定时任务 - 什么是ElasticJob?如何集成ElasticJob实现分布式任务调度?
前文展示quartz实现基于数据库的分布式任务管理和job生命周期的控制,那在分布式场景下如何解决弹性调度.资源管控.以及作业治理等呢?针对这些功能前当当团队开发了ElasticJob,2020 年 ...
- 在oracle中创建管理员密码
1.因为在安装Oracle11g时没有设置sys和system用户的密码,导致登陆不上SQLplus,后面用sqlplus / as sysdba ,密码为:root登陆上去创建了密码. 2.如下图
- 【原创】JS文件替换神器--Chrome ReRes插件
本文仅供学习交流使用,如侵立删! JS文件替换神器--Chrome ReRes插件 ReRes插件安装配置 ReRes项目官方地址:https://github.com/annnhan/ReRes 谷 ...
- axios post请求变为options请求的解决方法
全局配置 axios.defaults.headers['Content-Type']='application/x-www-form-urlencoded' 注意:使用全局配置会导致所有请求头的'C ...
- 关于 CDH 环境中部署 Dolphinscheduler 出现 hive-jdbc 包冲突的解决办法
目前社区小伙伴经常反映在 cdh 环境中部署 Dolphinscheduler 出现 hive 包冲突的问题,报错日志信息如下: [WARN] 2020-04-29 09:55:30.815 org. ...
- 层次分明井然有条,Go lang1.18入门精炼教程,由白丁入鸿儒,Go lang包管理机制(package)EP10
Go lang使用包(package)这种概念元素来统筹代码,所有代码功能上的可调用性都定义在包这个级别,如果我们需要调用依赖,那就"导包"就行了,无论是内部的还是外部的,使用im ...
- 来开源吧!发布开源组件到 MavenCentral 仓库超详细攻略
请点赞关注,你的支持对我意义重大. Hi,我是小彭.本文已收录到 GitHub · AndroidFamily 中.这里有 Android 进阶成长知识体系,有志同道合的朋友,关注公众号 [彭旭锐] ...
- SETTLE约束算法中的坐标变换问题
技术背景 在之前的两篇文章中,我们分别讲解了SETTLE算法的原理和基本实现和SETTLE约束算法的批量化处理.SETTLE约束算法在水分子体系中经常被用到,该约束算法具有速度快.可并行.精度高的优点 ...