链表中最简单的一种是单向链表,每个元素包含两个域,值域和指针域,我们把这样的元素称之为节点。每个节点的指针域内有一个指针,指向下一个节点,而最后一个节点则指向一个空值。如图就是一个单向链表

一个单向链表的节点被分成两个部分。第一个部分保存或者显示关于节点的信息,第二个部分存储下一个节点的地址。单向链表只可向一个方向遍历。

使用java实现一个简单的单链表,需要定义一个节点类、对节点的操作方法(add 、get、remove...)

**
* 单链表数据结构简单实现
*
* @author jade
*
*/
public class SingleLinkedList<E> { private Node<E> head = null; // 每个链表都存有一个空值的头结点。
private Node<E> tail = null; // 链表的最后一个结点,尾结点。
private int size = 0; // 当前链表中的节点数目。 /**
* 建立一个空链表(建立其头结点)。
*/
public SingleLinkedList() {
head = new Node<E>();
tail = head;
} /**
* 在链表的尾部插入数据
* @param e 待插入的数据
*
* @return
*/
public boolean add(E e) {
Node<E> node = new Node<E>(e); // 将要插入的值封装成一个节点。
tail.setNext(node); // 将待插入结点放到尾结点的下一个结点。
tail = tail.getNext(); // 将新增加的结点设为尾节点。
++size; // 链表大小增1。
return true;
} /**
*
* @param index 待插入的位置
* @param e 待插入的元素
*
* @return
*/
public boolean add(int index, E e) {
checkValidateIndex(index);
Node<E> newNode = new Node<E>(e);
Node preNode = null;
if (index > 0) {
preNode = getNode(index - 1);
}else{
preNode = head;
}
newNode.setNext(preNode.getNext());
preNode.setNext(newNode);
return true;
} /**
* 获取指定位置的结点的值
* @param index 欲获取值的结点的下标
*
* @return
*/
public E get(int index) {
checkValidateIndex(index);
Node<E> node = getNode(index);
return node.getValue();
} /**
* 删除指定位置的结点
* @param index 待删除结点的下标
* @return
*/
public boolean remove(int index) {
Node<E> curNode = null;
if (0 == index) {
curNode = head.getNext();
Node<E> nextNode = curNode.getNext();
head.setNext(nextNode);
} else {
checkValidateIndex(index);
curNode = getNode(index); // 获取待删除节点。
Node<E> preNode = getNode(index - 1); // 获取待删除节点的前一个结点。
preNode.setNext(curNode.getNext());
}
curNode.setNext(null); // 将待删除节点的下一结点置空。
return true;
} /**
* 设置指定位置结点的值。
* @param index 待设置值的结点的下标
* @param e
*/
public void set(int index, E e) {
checkValidateIndex(index);
Node<E> node = getNode(index);
node.setValue(e);
} /**
* 获取指定位置的结点
* @param index 获取结点的下标
*
*/
private Node<E> getNode(int index) {
checkValidateIndex(index);
Node<E> node = head;
for (int p = 0; p <= index; ++p) {
node = node.getNext();
}
return node;
} /**
* 验证下标值是否合法,非法时抛出异常。
* @param index 待验证的下标值
* @throws Exception
*
*/
private void checkValidateIndex(int index) {
if (index < 0 || index > size) {
throw new IndexOutOfBoundsException("无效的下标:" + index);
}
} /**
* 获取链表的大小。
* @return
*/
public int size() {
return size;
} /**
* 链表中的节点,e代表节点的值,next是指向下一个节点的引用
*
* @author jade
*
*/
static class Node<E> {
private E e;
private Node<E> next = null; Node() {
} Node(E e) {
this.e = e;
} public void setNext(Node<E> next) {
this.next = next;
} public Node<E> getNext() {
return next;
} public E getValue() {
return e;
} public void setValue(E e) {
this.e = e;
} }

单链表数据结构 - java简单实现的更多相关文章

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

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

  2. 单链表之Java实现

    初次接触java,用java也写了一个链表.代码如下: import java.io.*; class Node{ public int data; //数据域 public Node next; / ...

  3. C#单链表(数据结构)

    学习单链表的源码项目:http://files.cnblogs.com/xmfdsh/CSharp%E5%8D%95%E9%93%BE%E8%A1%A8.rar 链表是用一组任意的存储单元来存储线性表 ...

  4. 单链表反转java代码

    据说单链表反转问题面试中经常问,而链表这个东西相对于数组的确稍微难想象,因此今天纪录一下单链表反转的代码. 1,先定义一个节点类. public class Node { int index; Nod ...

  5. 使用java实现单链表----(java中的引用就是指针)

    //一直以为java中没有指针,其实java的引用就是指针,只不过堆栈中的引用储存了在堆中的地址,可以看做java中的指针.public class sibgleLink<E> { // ...

  6. 两个有序单链表合并成一个有序单链表的java实现

    仅作为备注, 便于自己回顾. import java.util.Arrays; public class MergeSort { public static class LinkedNode<V ...

  7. 单链表的java实现

    class LNode { public LNode next; public int data; } class Lianbiao { private static LNode head = new ...

  8. 数据结构——Java实现单链表

    一.分析 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素.链表中的数据是以结点来表示的,每个结点由元素和指针构成.在Java中,我们可以将单链表定义成一个类,单链表的基 ...

  9. 数据结构(java版)学习笔记(三)——线性表之单链表

    单链表的优点: 长度不固定,可以任意增删. 单链表的缺点: 存储密度小,因为每个数据元素,都需要额外存储一个指向下一元素的指针(双链表则需要两个指针). 要访问特定元素,只能从链表头开始,遍历到该元素 ...

随机推荐

  1. 【codeforces 242E】XOR on Segment

    [原题题面]传送门 [题面翻译]传送门 [解题思路] 操作涉及到区间求和和区间异或,考虑到异或操作,我们对每个数二进制分解. 把每一位单独提出来做,异或要么取反要么变为不变,对于每一位建一颗线段树,那 ...

  2. xueping wang 记录

    https://www.bbsmax.com/A/lk5aVBod1O/ https://pkgs.org/statistics/ 在firefox的调试控制台, 下面有一个独立的分割的控制台窗口, ...

  3. Java多线程的创建与简单使用

    一.线程的基本概念 什么是线程:Thread 进程内部的一个执行单元,它是程序中一个单一的顺序控制流程. 线程又被称为轻量级进程(lightweight process) 如果在一个进程中同时运行了多 ...

  4. BZOJ-2298|区间dp|线段树

    problem a Description 一次考试共有n个人参加,第i个人说:"有ai个人分数比我高,bi个人分数比我低."问最少有几个人没有说真话(可能有相同的分数) Inpu ...

  5. 信息安全之路-web-xss学习(1)

    关于xss反射性漏洞 1.未加任何过滤的 (1).在dvwa平台上可以看到源代码,如下 low级别 为了便于理解,代码如下: <?php // Is there any input? if( a ...

  6. ios高级开发之多线程(一)

    1.概念: 多线程(multithreading)到底是什么呢,它是指在软件或者硬件上实现多个线程并发执行的技术.具有多线程能力的计算机因有硬件的支持,而能够在同一时间执行多个线程,进而提升整体处理性 ...

  7. css3 calc()的用法

    转载自:css3 calc()的用法 说明:calc(四则运算):任何长度值都可以使用calc()函数进行计算:和平时的加减乘除优先顺序一样一样的: 特别注意:calc()里面的运算符必须前后都留一个 ...

  8. jmeter需要学习的其他点

    jmeter知识点访问地址参数化http请求默认值远程连接非GUI运行测试命令jmeter参数设置jmeter常用脚本开发 Beanshell sampleDebug SampleFtp请求java请 ...

  9. lua 5.3.5 安装/初体验

    安装 官网http://www.lua.org/start.html 参考  https://blog.csdn.net/qq_23954569/article/details/70879672 cd ...

  10. d3.event=null

    d3功能奇多, 已经模块化,(其实感觉和react差不多了). 所以默认打包的单个文件 <script src="https://d3js.org/d3.v5.min.js" ...