链表是一种物理存储单元上非连续、非顺序(即每个数据对象data存放的位置可以是非连续、非顺序的)的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。

链表中每一个元素称为结点,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据的数据域(设域名为data),另一个是存储下一个结点地址的指针域(设域名为next)。

使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组直接指定读取(比较:int a=b[3],直接读取b[3]的地址赋给a)的优点,同时链表由于增加了结点的指针域,空间开销比较大。

链表最明显的好处就是,一般数组排列关联项目的方式可能不同于这些数据项目在记忆体或磁盘上顺序,数据的存取往往要在不同的排列顺序中转换。链表允许插入和移除表上任意位置上的节点,但是不允许直接指定存取。

链表有很多种不同的类型:单向链表,双向链表以及循环链表。链表可以在多种编程语言中实现。像Lisp和Scheme这样的语言的内建数据类型中就包含了链表的存取和操作。程序语言或面向对象语言,如C,C++和Java依靠易变工具来生成链表。

使用方法(以单向链表为例):

单向链表是一种线性表,实际上是由节点(Node)组成的,一个链表拥有不定数量(N)的节点。其数据在内存中存储是不连续的,它存储的数据分散在内存中,每个结点只能也只有它能知道下一个结点的存储位置。由N个节点(Node)组成单向链表,每一个Node记录本Node的数据及下一个Node。向外暴露的只有一个头节点(Head),我们对链表的所有操作,都是直接或者间接地通过其头节点来进行的。

下面展示单链表的存储原理图,简单易懂,head为头节点,他不存放任何的数据,只是充当一个指向链表中真正存放数据的第一个节点的作用,而每个节点中都有一个next引用,指向下一个节点,就这样一节一节往下面记录,直到最后一个节点,其中的next指向null。

最先添加的节点对下一节点的引用可以为空。引用是引用下一个节点而非下一个节点的对象(即data)。

单向链表的实现:

packagecom.zjn.LinkAndQueue;

/**

* 自定义链表设计

*

* @author zjn

*

*/

public class MyLink {

Node head = null;

// 头节点

/**

* 链表中的节点,data代表节点的值,next是指向下一个节点的引用

*

* @author zjn

*

*/

class Node {

Node next = null;

// 节点的引用,指向下一个节点

int data;

// 节点的对象,即内容

public Node(int data) {

this.data = data;

}

}

/**

* 向链表中插入数据

*

* @param d

*/

public void addNode(int d) {

Node newNode = new Node(d);

// 实例化一个节点

if(head == null) {//如果指针的所指的结点为空,即表头为空时

head = newNode;

return;

}

Node tmp = head;

while(tmp.next != null) {

tmp = tmp.next;

}//while当前指针指向的下一个结点为空时,跳出循环

tmp.next = newNode;

}

/**

*

* @param index:删除第index个节点

* @return

*/

public Boolean deleteNode(int index) {

if(index < 1|| index > length()) {

return false;

}

if(index == 1) {

head = head.next;

return true;

}

int i = 1;

Node preNode = head;

Node curNode = preNode.next;

while(curNode != null) {

if(i == index) {

preNode.next = curNode.next;//将curNode所指向的下一个结点赋给preNode

return true;

}

preNode = curNode;

curNode = curNode.next;

i++;

}

return false;

}

/**

*

* @return 返回节点长度

*/

public  int length() {

int length = 0;

Node tmp = head;

while(tmp != null) {

length++;

tmp = tmp.next;

}

return length;

}

/**

* 在不知道头指针的情况下删除指定节点

*

* @param n

* @return

*/

public Boolean deleteNode11(Node n) {

if(n == null|| n.next == null)

return false;

int tmp = n.data;

n.data = n.next.data;//交换data

n.next.data = tmp;

n.next = n.next.next;//改变指向的下一个结点

System.out.println("删除成功!");

return true;

}

public void printList() {

Node tmp = head;

while(tmp != null) {

System.out.println(tmp.data);

tmp = tmp.next;

}

}

public static void main(String[] args) {

MyLink list = newMyLink();

list.addNode(5);

list.addNode(3);

list.addNode(1);

list.addNode(2);

list.addNode(55);

list.addNode(36);

System.out.println("linkLength:"+ list.length());

System.out.println("head.data:"+ list.head.data);

list.printList();

list.deleteNode(4);

System.out.println("After deleteNode(4):");

list.printList();

}

}

部分内容摘自百度百科以及脚本之家作者jianyuerensheng的文章《链表的原理及java实现代码示例》

java什么时候用链表_java链表的原理及使用方法相关推荐

  1. java遍历是什么意思_Java遍历集合的几种方法分析(实现原理、算法性能、适用场合)...

    概述 Java语言中,提供了一套数据集合框架,其中定义了一些诸如List.Set等抽象数据类型,每个抽象数据类型的各个具体实现,底层又采用了不同的实现方式,比如ArrayList和LinkedList ...

  2. java 方法继承方法_java的继承原理与实现方法详解

    本文实例讲述了java的继承原理与实现方法.分享给大家供大家参考,具体如下: 继承 1.java中是单继承的.每个子类只有一个父类. 语法:子类 extends 父类 2.在java中,即使没有声明父 ...

  3. java 笛卡尔积_Java笛卡尔积算法原理与实现方法详解

    本文实例讲述了Java笛卡尔积算法原理与实现方法.分享给大家供大家参考,具体如下: 笛卡尔积算法的Java实现: (1)循环内,每次只有一列向下移一个单元格,就是CounterIndex指向的那列. ...

  4. java初始化一个链表_Java 链表(LinkNode)的简单操作:初始化,遍历,插入,删除等...

    由于java中没有结构体,所以用一个类来定义链表,代码如下 主要包括一个data,还有一个指向后面一个节点的next 重写了toString函数,返回你想要的数据 定义链表的类: package Li ...

  5. 怎么使用java初始化链表_Java 链表(LinkNode)的简单操作:初始化,遍历,插入,删除等...

    由于java中没有结构体,所以用一个类来定义链表,代码如下 主要包括一个data,还有一个指向后面一个节点的next 重写了toString函数,返回你想要的数据 定义链表的类: package Li ...

  6. java listnode 合并链表_java链表ListNode删除特定值

    转自:qq_17525769的博客,网址:https://blog.csdn.net/qq_17525769/article/details/53915042 package algorithm; i ...

  7. java类和接口实例_Java定义泛型接口和类的方法实例分析

    本文实例讲述了Java定义泛型接口和类的方法.分享给大家供大家参考,具体如下: 一 点睛 所谓泛型:就是允许在定义类.接口指定类型形参,这个类型形参在将在声明变量.创建对象时确定(即传入实际的类型参数 ...

  8. java定时关机源码_java实现电脑定时关机的方法

    本文实例讲述了java如何注册成windows服务程序及一个简单的java定时关机程序代码,分享给大家供大家参考.具体方法如下: 一.问题: 最近想找个软件来控制电脑的关机时间,在网上找了几个,都是可 ...

  9. java构造方法可以重载吗_Java基础教程之构造器与方法重载

    在方法与数据成员中,我们提到,Java中的对象在创建的时候会初始化(initialization).初始化时,对象的数据成员被赋予初始值.我们可以显式初始化.如果我们没有给数据成员赋予初始值,数据成员 ...

最新文章

  1. 多线程还是多进程的区别
  2. 2.1.1进程的概念 组成和特征
  3. Java CountDownLatch的两种常用场景
  4. How to resolve empty table CRMATAB issue in ERP gt_crmtab[]
  5. WPF 从 .net core 3.1 到 .net 5.0
  6. Linux后台执行命令
  7. 华邦电子2022年3月营收为新台币92.17亿元
  8. pip安装tensorflow_Tensorflow源代码编译踩坑若干
  9. c语言中为什么无法输入文件,Devc写C语言时无法输入文件内容
  10. 纯HTML的个人简历,真的超简单,有源码
  11. HighNewTech:一文了解计算机思维、数学思维的本质区别,以及算法和程序的认知比较
  12. 翰文进度计划软件横道图不显示文字_说好的求一款项目管理软件,你们为什么推荐钉钉?...
  13. 值得收藏的网站----安全
  14. html正方形框架,长方形框架的制作方法
  15. 龙哥库他发matlab程序,编程实现四阶龙哥库塔法解方程
  16. 常用的个人网站建站系统
  17. vue+element 压缩上传图片
  18. 字美杯装饮料茶点打印机
  19. [渝粤教育] 兰州文理学院 信息技术基础 参考 资料
  20. css+js校验 实现仿网易邮箱注册界面 和 校验 功能

热门文章

  1. 彻底解决快压这个垃圾流氓软件
  2. 定积分的计算(分部积分法)习题
  3. 文件时间修改器,修改文件创建时间、修改时间
  4. 《ES6》(阮一峰)学习笔记
  5. android 系统应用流量,android获取手机流量使用情况
  6. 林子雨-Spark入门教程(Python版)-学习笔记(二)
  7. jQ模拟逐帧动画动画
  8. ubuntu下安装CLion并激活,亲测好用
  9. 通信原理樊昌信第七版_2019年南京邮电大学通信工程考研成功经验分享
  10. Internet Download Manager(IDM)网页下载浮动条不出现的问题记录