一、JAVA单向链表的操作(增加节点、查找节点、删除节点)

class Link { // 链表类
class Node { // 保存每一个节点,此处为了方便直接定义成内部类
private String data; // 节点的内容
private Node next; // 保存下一个节点 public Node(String data) { // 通过构造方法设置节点内容
this.data = data;
} public void add(Node node) { // 增加节点
if (this.next == null) { // 如果下一个节点为空,则把新节点加入到next的位置上
this.next = node;
} else { // 如果下一个节点不为空,则继续找next
this.next.add(node);
}
} public void print() { // 打印节点
if (this.next != null) {
System.out.print(this.data + "-->");
this.next.print();
} else {
System.out.print(this.data + "\n");
}
} public boolean search(String data) { // 内部搜索节点的方法
if (this.data.equals(data)) {
return true;
}
if (this.next != null) {
return this.next.search(data);
} else {
return false;
}
} public void delete(Node previous, String data) { // 内部删除节点的方法
if (this.data.equals(data)) {
previous.next = this.next;
} else {
if (this.next != null) {
this.next.delete(this, data);
}
}
}
} private Node root; // 定义头节点 public void addNode(String data) { // 根据内容添加节点
Node newNode = new Node(data); // 要插入的节点
if (this.root == null) { // 没有头节点,则要插入的节点为头节点
this.root = newNode;
} else { // 如果有头节点,则调用节点类的方法自动增加
this.root.add(newNode);
}
} public void print() { // 展示列表的方法
if (root != null) { // 当链表存在节点的时候进行展示
this.root.print();
}
} public boolean searchNode(String data) { // 在链表中寻找指定内容的节点
return root.search(data); // 调用内部搜索节点的方法
} public void deleteNode(String data) { // 在链表中删除指定内容的节点
if (root.data.equals(data)) { // 如果是头节点
if (root.next != null) {
root = root.next;
} else {
root = null;
}
} else {
root.next.delete(this.root, data);
}
}
}

  测试:

public class TestMain {

	public static void main(String[] args) {
Link l = new Link();
l.addNode("A"); l.addNode("B");
l.addNode("C");
l.addNode("D");
System.out.println("原链表:");
l.print();
String searchNode = "B";
System.out.println("查找节点:" + searchNode);
String result = l.searchNode(searchNode)?"找到!":"没找到!";
System.out.println("查找结果:" + result);
System.out.println("删除节点:" + searchNode);
l.deleteNode(searchNode);
System.out.println("删除节点后的链表:");
l.print(); } }

  测试结果如下:

原链表:
A-->B-->C-->D
查找节点:B
查找结果:找到!
删除节点:B
删除节点后的链表:
A-->C-->D

原地址  

 二、双向链表的简单实现

public class DoubleLink<T> {

	/**
* Node<AnyType>类定义了双向链表中节点的结构,它是一个私有类, 而其属性和构造函数都是公有的,这样,其父类可以直接访问其属性
* 而外部类根本不知道Node类的存在。
*
* @author ZHB
*
* @param <T>
* 类型
* @param Data
* 是节点中的数据
* @param pre
* 指向前一个Node节点
* @param next
* 指向后一个Node节点
*/
private class Node<T> {
public Node<T> pre;
public Node<T> next;
public T data; public Node(T data, Node<T> pre, Node<T> next) {
this.data = data;
this.pre = pre;
this.next = next;
} public Node() {
this.data = null;
this.pre = null;
this.next = null;
}
} // 下面是DoubleLinkedList类的数据成员和方法
private int theSize;
private Node<T> Header;
private Node<T> Tail; /*
* 构造函数 我们构造了一个带有头、尾节点的双向链表 头节点的Next指向尾节点 为节点的pre指向头节点 链表长度起始为0。
*/
public DoubleLink() { theSize = 0;
Header = new Node<T>(null, null, null);
Tail = new Node<T>(null, Header, null); Header.next = Tail;
} public void add(T item) { Node<T> aNode = new Node<T>(item, null, null); Tail.pre.next = aNode;
aNode.pre = Tail.pre;
aNode.next = Tail;
Tail.pre = aNode; theSize++;
} public boolean isEmpty() {
return (this.theSize == 0);
} public int size() {
return this.theSize;
} public T getInt(int index) { if (index > this.theSize - 1 || index < 0)
throw new IndexOutOfBoundsException(); Node<T> current = Header.next; for (int i = 0; i < index; i++) {
current = current.next;
} return current.data;
} public void print() { Node<T> current = Header.next; while (current.next != null) { System.out.println(current.data.toString()); current = current.next;
} } public static void main(String[] args) {
DoubleLink<String> dLink = new DoubleLink<String>(); dLink.add("zhb");
dLink.add("zzb");
dLink.add("zmy");
dLink.add("zzj"); System.out.println("size : " + dLink.size());
System.out.println("isEmpty? : " + dLink.isEmpty());
System.out.println("3 : " + dLink.getInt(2));
dLink.print();
}
}

  原文地址

JAVA单向/双向链表的实现的更多相关文章

  1. JAVA实现双向链表的增删功能

    JAVA实现双向链表的增删功能,完整代码 package linked; class LinkedTable{ } public class LinkedTableTest { //构造单链表 sta ...

  2. Java简单双向链表实现 @version 1.0

    package com.list; /** * 数据结构和算法Java表示 双向链表 * * @version 1.0 * @author 小明 * */ public class MyDoublel ...

  3. JAVA单向链表实现

    JAVA单向链表实现 单向链表 链表和数组一样是一种最常用的线性数据结构,两者各有优缺点.数组我们知道是在内存上的一块连续的空间构成,所以其元素访问可以通过下标进行,随机访问速度很快,但数组也有其缺点 ...

  4. Java 单向链表学习

    Java 单向链表学习 链表等同于动态的数组:可以不同设定固定的空间,根据需要的内容动态的改变链表的占用空间和动态的数组同一形式:链表的使用可以更加便于操作. 链表的基本结构包括:链表工具类和节点类, ...

  5. java单向加密算法小结(2)--MD5哈希算法

    上一篇文章整理了Base64算法的相关知识,严格来说,Base64只能算是一种编码方式而非加密算法,这一篇要说的MD5,其实也不算是加密算法,而是一种哈希算法,即将目标文本转化为固定长度,不可逆的字符 ...

  6. 大话数据结构(八)Java程序——双向链表的实现

    线性链表--双向链表 双向链表定义: 双向链表(double linked list): 是在单表单的每个结点中,再设置一个指向前驱结点的指针域.因此,在双向链表中的结点都有两个指针域,一个指向前驱, ...

  7. Java中双向链表的代码实现

    写在前面: 双向链表是一种对称结构,它克服了单链表上指针单向性的缺点,其中每一个节点即可向前引用,也可向后引用,这样可以更方便的插入.删除数据元素. 由于双向链表需要同时维护两个方向的指针,因此添加节 ...

  8. JAVA 单向链表

    package com.session.link; /** * 单向链表 */public class LinkedList<T> { private Node head;//指向链表头节 ...

  9. Java数据结构--双向链表的实现

    #java学习经验总结------双向链表的实现 双向链表的建立与单链表类似,只是需要使用pre指针指向前一个结点,并且在删除添加时不仅仅考虑next package datastructure; p ...

随机推荐

  1. javascript数组常用方法汇总

    1.join()方法: Array.join()方法将数组中所以元素都转化为字符串链接在一起,返回最后生成的字符串.也可以指定可选的字符串在生成的字符串中来分隔数组的各个元素.如果不指定分隔符,默认使 ...

  2. gameui-for-phaser-js更新到最新版本

    Hola Cantk是一个功能强大的游戏引擎,它拥有丰富的GUI控件,配合Hola Studio可以快速开发出游戏的UI界面.Phaser是一个流行而且强大的游戏引擎,但是它的GUI控件很少,而且缺乏 ...

  3. js中var 笔记

    js中声明变量会用到Var; 1,var a;声明一个变量a,此时输出a,会显示undefined:因为此时的a未定义: 2, var a=0;和b=0;有什么区别呢? 当声明一个全局变量时,实际是定 ...

  4. jquery的一些属性选择器

    td:contains(Henry)选择td里面所有class为Henry的元素 .siblings()选择相同dom层次的所有其他元素,例如 <ul> <li>第一个< ...

  5. "struct"类型重定义解决办法

    #ifndef 在头文件中的作用 在一个大的软件工程里面,可能会有多个文件同时包含一个头文件,当这些文件编译链接成一个可执行文件时,就会出现大量 “重定义”的错误. 在头文件中使用#ifndef #d ...

  6. c#连接各种数据库

    1.C#连接连接Access程序代码: ------------------------------------------------------------------------------- ...

  7. jQuery对input select操作小结

    //遍历option和添加.移除optionfunction changeShipMethod(shipping){ var len = $("select[@name=ISHIPTYPE] ...

  8. iOS开发Swift篇—(四)运算符

    iOS开发Swift篇—(四)运算符 一.运算符 1.Swift所支持的部分运算符有以下一些 赋值运算符:= 复合赋值运算符:+=.-= 算术运算符:+.-.*./ 求余运算符:% 自增.自减运算符: ...

  9. Java类文件最大限制

    今天在往一个jsp文件里添加代码时,项目跑起来访问这个jsp时报错.. The code of method _jspService(HttpServletRequest, HttpServletRe ...

  10. wp8.1 Study16:网络之 使用Azure移动服务及利用Azure推送通知服务

    一.WP8.1有关网络的API WP8.1与其它平台的对比如下图: 二.Azure移动服务 前提: Azure移动服务可以让使用者的数据存放在云空间,从而方便使用者的App在不同平台上的数据共享. 1 ...