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

注:在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. 从零开始搭建Vue2.0项目(一)之快速开始

    从零开始搭建Vue2.0项目(一)之项目快速开始 前言 该样板适用于大型,严肃的项目,并假定您对Webpack和有所了解vue-loader.确保还阅读vue-loader的文档,了解常见的工作流程配 ...

  2. 常用的函数式接口_Predicate接口和常用的函数式借楼_Predicate_默认方法and

    package com.yang.Test.PredicateStudy; import java.util.function.Predicate; /** * java.util.function. ...

  3. 从零开始Blazor Server(4)--登录系统

    说明 上一篇文章中我们添加了Cookie授权,可以跳转到登录页了.但是并没有完成登录,今天我们来完成它. 我们添加Cookie授权的时候也说了,这套跟MVC一模一样,所以我们登录也是跟MVC一模一样. ...

  4. 6.15 NOI 模拟

    \(T1\ ckr\)与平方数 不会吧,不会吧,真有人不会积分,好吧,我真的一点也不会... 基本公式\(:\) \(1.\)多项式定积分的计算方法 \[f(x)=\sum_{i=0}^nc_ix^i ...

  5. Docker容器网络配置

    Docker容器网络配置 1.Linux内核实现名称空间的创建 1.1 ip netns命令 可以借助ip netns命令来完成对 Network Namespace 的各种操作.ip netns命令 ...

  6. 从零开始Blazor Server(11)--编辑用户

    用户编辑和角色编辑几乎一模一样,这里先直接贴代码. @page "/user" @using BlazorLearn.Entity @using Furion.DataEncryp ...

  7. Docker 06 部署Nginx

    参考源 https://www.bilibili.com/video/BV1og4y1q7M4?spm_id_from=333.999.0.0 https://www.bilibili.com/vid ...

  8. RS485自动收发切换电路 [原创www.cnblogs.com/helesheng]

    RS485是最常见的一种远距离可靠传输和组网的UART串口信号接口协议.与同样传输UART串口信号的RS422协议相比,RS485使用半双工通信,即只有一个信道,在同一时刻要么从A到B,要么从B到A传 ...

  9. 快速搭建 SpringCloud Alibaba Nacos 配置中心!

    Spring Cloud Alibaba 是阿里巴巴提供的一站式微服务开发解决方案,目前已被 Spring Cloud 官方收录.而 Nacos 作为 Spring Cloud Alibaba 的核心 ...

  10. 全局索引与分区索引对于SQL性能影响的比较

    KingbaseES 提供了对于分区表 global index 的支持.global index 不仅提供了对于唯一索引功能的改进(无需包含分区键),而且在性能上相比非global index (l ...