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

链表是一种数据结构,和数组同级。比如,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. UGUI的优点新UI系统四 开源
  2. 为什么jsp写script代码报错_JSP 报错:ReferenceError: $ is not defined
  3. Python 的文件IO相关操作说明
  4. Wannafly挑战赛22 B 字符路径 ( 拓扑排序+dp )
  5. 【视觉项目】【day2】8.21号实验记录(手机固定高度15cm拍摄+直方图均衡化+模板匹配,模板12个,测试28个,效果十分差)
  6. UWP开发细节记录:判断文件类型
  7. Linux之深入理解anaconda使用
  8. Javascript当中的RSA加解密
  9. 《Tableau数据可视化实战》——1.3节连接Excel文件
  10. emqx_auth_mysql报错_EMQ插件组合实现物联网边缘平台的设备通信管理
  11. Reflector for .NET 下载问题
  12. 武汉好地科技为您解析CMMI3和CMMI5的区别
  13. Hessian matrix黑塞矩阵(海森矩阵)和雅克比矩阵Jacobian matrix
  14. 【Java 8 新特性】Java LocalDate 详解
  15. Keras机器翻译实战
  16. 计算机英语四六级考试时间,2019年12月英语四六级考试时间
  17. ios html5不显示图片,为什么iOS上的Safari不显示我的HTML5视频海报?
  18. 【RFC6405 IP 电话 (VoIP) SIP 对等互连用例 VoIP SIP Peering Use Cases】(翻译)
  19. 【深度学习】Pytorch实现CIFAR10图像分类任务测试集准确率达95%
  20. 理解事务四大特性(Transaction)——原子性、一致性、隔离性和持久性(ACID)

热门文章

  1. 【计算机视觉】Harris-SIFT特征点检测
  2. attck-Execution
  3. python if elif else_Python的 if .else.elif语句详解
  4. 火山PC抓取快递物流查询接口教程第一课
  5. 5G进入射频前端技术的发展前景分析
  6. 关于Ground truth
  7. 异常检测——高维数据异常检测
  8. 中维世纪Java一面
  9. fedora 24 重新加载 pac 文件 (gui)
  10. 取消算法推荐,是技术上的倒退吗?