本文章同步到本人的博客站点 燕归来

链表是一种数据结构,和数组同级。比如,Java中我们使用的ArrayList,其实现原理是数组。而LinkedList的实现原理就是链表了。链表在进行循环遍历时效率不高,但是插入和删除时优势明显。下面对单向链表做一个介绍。

什么是单向链表?

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

image

单向链表的代码实现

链表的过程这里不做过多的赘述,下面我们看一下使用Java实现简单的单向链表:

package com.tao.struct.list;

/** @author 周涛 */

public class LinkList {

private Node head;

private Node rear;

private Node point;

private int length;

//内部私有类

private class Node {

private T object;

private Node next;

public Node() {

object = null;

}

public Node(T object) {

this.object = object;

}

public Node(T object, Node next) {

this.object = object;

this.next = next;

}

}

public LinkList() {

head = new Node();

rear = head;

length = 0;

}

public void add(T o) {

point = new Node(o);

rear.next = point;

rear = point;

length++;

}

/**

* 在链表尾部新增数据

*

* @param index

* @param o

*/

public void add(int index, T o) {

if (index > length) {

throw new IllegalArgumentException();

}

// 移动Point到指定位置

movePoint(index);

Node tmp = new Node(o);

tmp.next = point.next;

point.next = tmp;

length++;

}

/**

* 将point指针移到index位置

*

* @param index

*/

private void movePoint(int index) {

point = head;

while (point.next != null) {

if (index == 0) {

break;

}

index--;

point = point.next;

}

}

/** 删除链表所有数据 */

public void clear() {

head = null;

length = 0;

rear = head;

System.gc();

}

/**

* 获取指定位置的数据

*

* @param index

* @return

*/

public T get(int index) {

movePoint(index);

return point.next.object;

}

/**

* 判断链表是不是空的

*

* @return

*/

public boolean isEmpty() {

return length == 0;

}

/**

* 移除指定位置的数据

*

* @param index

*/

public void remove(int index) {

movePoint(index);

point.next = point.next.next;

length --;

}

/**

* 获取链表的长度信息

*

* @return

*/

public int size() {

return length;

}

/**

* 更新指定位置的数据

*

* @param index

* @param o

*/

public void set(int index, T o) {

movePoint(index);

point.next.object = o;

}

/** 遍历输出链表的数据 */

public void traverse() {

point = head;

if (point != null) {

while (point.next != null) {

System.out.print(point.next.object + "\t");

point = point.next;

}

}

System.out.println();

}

}

测试代码

注意,此测试依赖JUnit4单元测试框架

package com.tao.struct.list;

import junit.framework.TestCase;

/**

* @author 周涛

*/

public class LinkListTest extends TestCase {

public void testAdd() {

LinkList linkList=new LinkList();

//测试在尾部新增数据

for(int i=0;i<10;i++){

linkList.add(String.valueOf(i));

}

// 遍历输出链表

System.out.print("数据信息为:");

linkList.traverse();

//测试在指定位置插入数据

linkList.add(3,"*");

System.out.print("插入新的数据后:");

linkList.traverse();

//获取指定位置的数据

String s = linkList.get(3);

System.out.println("获取第3位置的数据是:"+s);

//移除指定位置的数据

linkList.remove(3);

System.out.print("移除第3位置的数据后:");

linkList.traverse();

//更新指定位置数据后

linkList.set(3,"333");

System.out.print("更新指定位置数据后");

linkList.traverse();

// 判断链表是不是空的

System.out.println("当前链表长度:" + linkList.size());

System.out.println("当前链表是否为空:" + linkList.isEmpty());

linkList.clear();

System.out.println("清空链表后是否为空:" + linkList.isEmpty());

}

}

测试结果

image

java集合单向链表_Java实现单向链表数据结构相关推荐

  1. 关于java集合的知识点_java中集合的知识点

    1.JAVA中集合都存放在java.util包中 2.JAVA集合中主要分为三种类型:Set,List,Map.我写的这篇文章主要是对Set和List的理解 3.Collection是最基本的集合接口 ...

  2. java集合框架介绍_Java集合框架介绍

    Java集合框架介绍 发布时间:2020-06-26 17:00:14 来源:亿速云 阅读:85 作者:Leah 这篇文章将为大家详细讲解有关Java集合框架介绍,文章内容质量较高,因此小编分享给大家 ...

  3. java集合框架类_Java集合框架总结—超详细-适合面试

    Set和List接口是Collection接口派生的两个子接口,Queue是Java提供的队列实现,类似于List. Map实现类用于保存具有映射关系的数据(key-value). 2.Set.Lis ...

  4. java 集合与泛型_java的集合和泛型的知识点归纳1

    [Collection.泛型] 主要内容 Collection集合 迭代器 增强for 泛型 教学目标 [ ] 能够说出集合与数组的区别 [ ] 说出Collection集合的常用功能 [ ] 能够使 ...

  5. java集合的遍历_java集合遍历方法总结

    java集合遍历方法总结 一.for循环遍历集合 使用条件: ①能否确定集合中的元素个数 ②集合是否可以通过整数索引值来精确位置 public static void forTraversal(){ ...

  6. java 反转jia链表_Java实现单链表反转

    本文主要介绍单链表反转的两种方法,记录如下: 1. package com.leetcode; public class ListReverse { public static void main(S ...

  7. java集合对象声明_Java基础————集合类

    原标题:Java基础----集合类 理解集合类 集合类存放于java.util包中. 集合类存放的都是对象的引用,而非对象本身,出于表达上的便利,我们称集合中的对象就是指集合中对象的引用(refere ...

  8. java 集合 总结 表_java 列表与集合总结

    列表与集合 (一切输出都用for each!丢弃迭代器) 列表List 1顺序表 Arraylist  适用于静态查找 2   链式双向表 Linkedlist 适用于增删该查 3 (容器) Vect ...

  9. java 集合自定义元素_java集合 collection-list-ArrayList 将自定义对象作为元素存到ArrayList集合中,并去除重复元素。...

    import java.util.*;/*将自定义对象作为元素存到ArrayList集合中,并去除重复元素. 比如:存人对象.同姓名同年龄,视为同一个人.为重复元素. 思路: 1,对人描述,将数据封装 ...

最新文章

  1. USB、TTL电平、232电平之间的相互转换
  2. ES6箭头函数和模板字符串
  3. 配置静态路由下一跳为本地出战接口和IP地址的区别
  4. Entity Framework Core生成的存储过程在MySQL中需要进行处理及PMC中的常用命令
  5. python子进程修改父进程内变量_如何将父变量传递给python中的子进程?
  6. 沈航计算机考研上岸,【图片】一战厦大计算机上岸,经验帖。慢更【考研吧】_百度贴吧...
  7. 良心推荐:高品质音乐播放器Audirvana for Mac
  8. 信息学奥赛一本通(1234:2011)
  9. html radio 更换图片,html修改radio、checkbox样式
  10. 《Unity3D脚本编程与游戏开发》学习Day one
  11. exoplay切换全屏_基于exoPlayer 拓展自定义播放器
  12. 索尼相机手机控制对焦,操控指南丨 使用索尼微单的十个小技巧
  13. 超分辨重建-Bicubic双三次线性插值opencv实现
  14. matlab画进化树分析图,教你用ggtree绘制高颜值进化树
  15. Method of Four Russians 算法
  16. Tensorflow Serving初体验
  17. windows安装Oracle12 (服务端+客户端)
  18. Ubuntu 安装源及初始配置
  19. 检索 国家自然科学基金
  20. 什么是自动气象站 校园气象站

热门文章

  1. 显示mysql建表语句_mysql 显示建表语句
  2. 算法:三数之和(js)
  3. 【论文详解】DPED:DSLR-Quality Photos on Mobile Devices with Deep Convolutional Networks
  4. foxmail服务器上保留邮件,如果Foxmail中只保留了Mails文件夹,我的邮件还能恢复吗?...
  5. 运动状态最佳心率计算器 (Target-Heart-Rate Calculator)
  6. 手机APP兼容性测试
  7. 程序员面试金典适合java么,程序员面试金典(java版)
  8. (C++的对话)Solmyr 的小品文系列之二:模棱两可的陷阱
  9. 【Qt学习】 OpenCV美图特效
  10. 欢乐球球脚本 python_Unity 欢乐球球