链表:在计算机中用一组任意的存储单元存储线性表的数据元素称为链式存储结构,这组存储结构可以是连续的,也可以是不连续的,因此在存储数据元素时可以动态分配内存。

注:在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实现)的更多相关文章

  1. 数据结构之单链表的实现-java

    一.单链表基本概念 单链表是一种链式存取的数据结构,用一组地址任意的存储单元(一般是非连续存储单元)存放线性表中的数据元素.链表中的数据是以结点来表示的,每个结点的构成:元素data + 指针next ...

  2. 线性表概述及单链表的Java实现

    一.线性表概述 线性表是指一组数据元素之间具有线性关系的元素序列,它表现为:除第一个元素没有直接前驱元素.最后一个元素没有直接后继元素外,其余所有元素都有且仅有一个直接前驱元素和直接后继元素. 根据存 ...

  3. Python数据结构之单链表

    Python数据结构之单链表 单链表有后继结点,无前继结点. 以下实现: 创建单链表 打印单链表 获取单链表的长度 判断单链表是否为空 在单链表后插入数据 获取单链表指定位置的数据 获取单链表指定元素 ...

  4. javascript数据结构之单链表

    下面是用javascript实现的单链表,但是在输出的时候insert方法中存在问题,chrome的console报错说不能读取空的属性,调试了很久都没有通过,先在这里存着,以后再来修改一下. //数 ...

  5. 数据结构(一) 单链表的实现-JAVA

    数据结构还是很重要的,就算不是那种很牛逼的,但起码得知道基础的东西,这一系列就算是复习一下以前学过的数据结构和填补自己在这一块的知识的空缺.加油.珍惜校园中自由学习的时光.按照链表.栈.队列.排序.数 ...

  6. 数据结构(2):单链表学习使用java实现

    单链表是单向链表,它指向一个位置: 单链表常用使用场景:根据序号排序,然后存储起来. 代码Demo: package com.Exercise.DataStructure_Algorithm.Sing ...

  7. Java数据结构之单链表

    这篇文章主要讲解了通过java实现单链表的操作,一般我们开始学习链表的时候,都是使用C语言,C语言中我们可以通过结构体来定义节点,但是在Java中,我们没有结构体,我们使用的是通过类来定义我们所需要的 ...

  8. Java数据结构-03单链表(二)

    在之前我们封装了一些操作在接口类中,并在抽象类实现了相同的方法.下面我们开始写代码: 无头结点单链表:(注意下面的AbstractList是之前抽取的类,不是java.util包下的类) public ...

  9. 图解Java数据结构之单链表

    本篇文章介绍数据结构中的单链表. 链表(Linked List)介绍 链表可分为三类: 单链表 双向链表 循环列表 下面具体分析三个链表的应用. 单链表 链表是有序的列表,它在内存中存储方式如下: 虽 ...

随机推荐

  1. dockerfile操作

    简介 Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明. 上下文路径 如下是一个简单的基于dockerfile创建镜像的命令,我们注意到启动处理镜像名和 ...

  2. 使用Python3.7+Django2.0.4配合vue.js2.0的组件递归来实现无限级分类(递归层级结构)

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_133 所谓的无限极分类是啥?其实简单点说就是一个人类可以繁衍出多个后代,然后一个后代又可以分另外多个后代这样无限繁衍下去(可以想象 ...

  3. HTML5 基础学习

    HTML 基础学习 参考资料 视频课程:https://www.bilibili.com/video/BV14J4114768 W3C文档:https://webplatform.github.io/ ...

  4. BTDetect用户协议和技术支持

    1.巴蜀生物科技检测用户协议 2.基于机器学习的生物检测项目 3.BTDetect用户手册和技术支持

  5. LuoguP3047 [USACO12FEB]附近的牛Nearby Cows(树形DP,容斥)

    \[f[u][step] = \begin{cases} C[u] & step = 0 \\ (\sum{f[v][step - 1]}) - f[u][step - 2] \cdot (d ...

  6. Luogu2251 质量检测 (ST表)

    我怎么开始划水了... #include <iostream> #include <cstdio> #include <cstring> #include < ...

  7. Redis 07 有序集合

    参考源 https://www.bilibili.com/video/BV1S54y1R7SB?spm_id_from=333.999.0.0 版本 本文章基于 Redis 6.2.6 Zset 就是 ...

  8. Linux操作系统学习(运维必会)

    Linux一切皆文件,最高权限的账户root. 1.开机登录 开机会启动很多进程,在Windows上叫"服务"(service),在Linux上叫做"守护进程" ...

  9. 我开源了一个Go学习仓库|笔记预览

    前言 大半个月前我参与了字节后端面试,未通过第四面,面试总结写在了这篇文章: https://juejin.cn/post/7132712873351970823 在此文的末尾,我写到为了全面回顾Go ...

  10. Spring mvc源码分析系列--前言

    Spring mvc源码分析系列--前言 前言 距离上次写文章已经过去接近两个月了,Spring mvc系列其实一直都想写,但是却不知道如何下笔,原因有如下几点: 现在项目开发前后端分离的趋势不可阻挡 ...