JAVA双向列表

1.链表是一种重要的数据结构,在程序设计中占有很重要的地位

2.我们可以用类List来实现链表结构,用变量Head、Tail、Length、Pointer来实现表头。存储当前结点的指针时有一定的技 巧,Pointer并非存储指向当前结点的指针,而是存储指向它的前趋结点的指针,当其值为null时表示当前结点是第一个结点。那么为什么要这样做呢? 这是因为当删除当前结点后仍需保证剩下的结点构成链表,如果Pointer指向当前结点,则会给操作带来很大困难。那么如何得到当前结点呢,我们定义了一 个方法cursor(),返回值是指向当前结点的指针。类List还定义了一些方法来实现对链表的基本操作,通过运用这些基本操作我们可以对链表进行各种 操作。例如reset()方法使第一个结点成为当前结点。insert(Object d)方法在当前结点前插入一个结点,并使其成为当前结点。remove()方法删除当前结点同时返回其内容,并使其后继结点成为当前结点,如果删除的是最 后一个结点,则第一个结点变为当前结点。

  1 /**
  2  * 双向链表的实现
  3  * @author Skip
  4  * @version 1.0
  5  */
  6 public class DoubleNodeList<T> {
  7  //节点类
  8  private static class Node<T>{
  9   Node<T> perv;  //前节点
 10   Node<T> next;  //后节点
 11   T data;    //数据
 12
 13   public Node(T t){
 14    this.data = t;
 15   }
 16  }
 17  private Node<T> head;  //头节点
 18  private Node<T> last;  //尾节点
 19  private Node<T> other;  //备用节点存放临时操作
 20  private int length;  //链表长度
 21
 22  /**
 23   * 无参构造
 24   */
 25  public DoubleNodeList(){
 26   head = new Node<T>(null);
 27   last = head;
 28   length = 0;
 29  }
 30
 31  /**
 32   * 初始化时创建一个节点
 33   * @param data 数据
 34   */
 35  public DoubleNodeList(T data){
 36   head = new Node<T>(data);
 37   last = head;
 38   length = 1;
 39  }
 40
 41  /**
 42   * 添加一个节点
 43   * @param data 添加的数据
 44   */
 45  public void add(T data){
 46   if(isEmpty()){
 47    head = new Node<T>(data);
 48    last = head;
 49    length++;
 50   }else{
 51    //尾插法
 52    other = new Node<T>(data);
 53    other.perv = last;
 54    last.next = other;
 55    last = other;
 56    length++;
 57   }
 58  }
 59
 60  /**
 61   * 在指定数据后插入一个节点
 62   * @param data 指定的数据
 63   * @param insertData 插入的数据
 64   * @return 插入成功返回true,不成功返回false
 65   */
 66  public boolean addAfert(T data , T insertData){
 67   other = head;
 68   while(other != null){
 69    if(other.data.equals(data)){
 70     Node<T> t = new Node<T>(insertData);
 71     t.perv = other;
 72     t.next = other.next;
 73     other.next = t;
 74     //判断是否在最后一个节点后添加节点
 75     if(t.next==null){
 76      last = t;
 77     }
 78     length++;
 79     return true;
 80    }
 81    other = other.next;
 82   }
 83   return false;
 84  }
 85
 86  /**
 87   * 在指定数据前插入一个节点
 88   * @param data 指定的数据
 89   * @param insertData 插入的数据
 90   * @return 插入成功返回true,不成功返回false
 91   */
 92  public boolean addBefore(T data, T insertData){
 93   other = head;
 94   while(other != null){
 95    if(other.data.equals(data)){
 96     Node<T> t = new Node<T>(insertData);
 97     t.perv = other.perv;
 98     t.next = other;
 99     other.perv.next = t;
100     length++;
101     return true;
102    }
103    other = other.next;
104   }
105   return false;
106  }
107
108  /**
109   * 获得索引处的数据
110   * @param index 索引
111   * @return 数据
112   */
113  public T get(int index){
114   if(index>length || index<0){
115    throw new IndexOutOfBoundsException("索引越界:"+index);
116   }
117   other = head;
118   for(int i=0;i<index;i++){
119    other = other.next;
120   }
121   return other.data;
122  }
123
124  /**
125   * 新值替换旧值
126   * @return 成功为true,未找到为false
127   */
128  public boolean set(T oldValue,T newValue){
129   other = head;
130   while(other!=null){
131    if(other.data.equals(oldValue)){
132     other.data = newValue;
133     return true;
134    }
135    other = other.next;
136   }
137   return false;
138  }
139
140  /**
141   * 移除指定的元素
142   * @param data 需要移除的元素
143   * @return 不存在为false,成功为true
144   */
145  public boolean remove(T data){
146   other = head;
147   while(other != null){
148    if(other.data.equals(data)){
149     other.perv.next = other.next;
150     length--;
151     return true;
152    }
153    other = other.next;
154   }
155   return false;
156  }
157
158  /**
159   * 链表中是否包含此元素
160   * @return 包含为true,不包含为false
161   */
162  public boolean contains(T data){
163   other = head;
164   while(other != null){
165    if(other.data.equals(data)){
166     return true;
167    }
168    other = other.next;
169   }
170   return false;
171  }
172
173  /**
174   * 获得最后一个节点的数据
175   * @return 最后一个节点的数据
176   */
177  public T getLast(){
178   return last.data;
179  }
180
181  /**
182   * 获得第一个节点的数据
183   * @return 第一个节点的数据
184   */
185  public T getFirst(){
186   return head.data;
187  }
188
189  /**
190   * 获得链表的长度
191   * @return 长度
192   */
193  public int getSize(){
194   return length;
195  }
196
197  /**
198   * 是否为空链表
199   * @return 空链表为true,非空链表为false
200   */
201  public boolean isEmpty(){
202   return length==0;
203  }
204
205  /**
206   * 清空链表
207   */
208  public void clear(){
209   head = null;
210   length = 0;
211  }
212
213  /**
214   * 输出链表内所有节点
215   */
216  public void printList(){
217   if(isEmpty()){
218    System.out.println("空链表");
219   }else{
220    other = head;
221    for(int i=0;i<length;i++){
222     System.out.print(other.data+" ");
223     other = other.next;
224    }
225    System.out.println();
226   }
227  }
228 }
时间: 2024-10-26 08:55:08

JAVA双向列表的相关文章

Java 散列表 hash table

Java 散列表 hash table @author ixenos hash table, HashTable, HashMap, HashSet hash table 是一种数据结构 hash table 为每个对象计算一个整数,该整数被称为散列码 hash code hash code 是由对象的实例域产生的一个整数,具有不同的数据域的对象将产生不同的hash code 如果自定义类,就要负责实现这个类的hashCode方法,注意要与equals方法兼容,即如果a.equals(b)为tr

jquery双向列表选择器DIV模拟版

前段时间项目需要用到双向列表选择,想直接用select,结果发现某些样式不支持,只好用div模拟了以下,功能基本实现能用了,需要其他功能自己加上,譬如列表里展示多列数据等. <!doctype html> <html> <head> <meta charset="utf-8"> <title>双向列表选择器DIV模拟</title> <script type="text/javascript&quo

jquery双向列表选择器select版

这个是select版的,若想美化某些样式是不支持得,可以用div模拟版的,功能基本实现能用了,需要其他功能自己加上. div模拟版链接:http://www.cnblogs.com/tie123abc/p/6018755.html <!doctype html> <html> <head> <meta charset="utf-8"> <title>双向列表选择器select版</title> <script

【转】JAVA知识点列表

网上盗链的JAVA知识点列表,学习安卓开发前对JAVA要有一个基本的了解,作为一个CheckList,有空检测下自己 1 开发环境Java SDK 下载和安装2 环境变量的配置(path和classpath)3 编程基础 标识符命名规范4 Java数据类型5 运算符6 分支语句(if,switch)7 循环语句(for,while)8 函数的定义方法9 面向对象基础 面向对象与面向过程语言之间的区别10 面向对象基本思想(封装)11 类的定义方法12 对象和类的关系13 对象的创建方法14 通过

《Java知识点列表》V1.0

<Java知识点列表>V1.0  1 开发环境Java SDK 下载和安装 2 环境变量的配置(path和classpath) 3 编程基础 标识符命名规范 4 Java数据类型5 运算符6 分支语句(if,switch)7 循环语句(for,while)8 函数的定义方法9 面向对象基础 面向对象与面向过程语言之间的区别10 面向对象基本思想(封装)11 类的定义方法12 对象和类的关系13 对象的创建方法14 通过对象使用成员变量和成员函数的方法15 构造函数的作用16 函数的重载17 s

资源-Java:Java资源列表

ylbtech-资源-Java:Java资源列表 1. 开发软件返回顶部 1.Eclipse https://www.eclipse.org/ 2.IntelliJ IDEA https://www.jetbrains.com/idea/ 3. 2. 技术体系返回顶部 3. 开发框架返回顶部 1.Spring https://spring.io/ 1.1.Spring Boot https://spring.io/projects/spring-boot/ 1.2.Spring Mvc http

java中 列表,集合,数组之间的转换

List和Set都是接口,它们继承Collection(集合),集合里面任何数据类型都可以添加 List是有序的队列,可以用重复的元素:而Set是数学概念中的集合,不能有重复的元素. 数组 长度固定  可存储任何数据类型       集合 长度可变(包括:list,set)可存储任何数据类型 列表 list   有序   长度可变   元素可重复     集set  无序   长度可变   元素不可重复 将数组转化为一个列表时,程序员们经常这样做: String[] arr = {"a"

JAVA list 列表 字典 dict

import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import java.util.Set; public class list_map { //列表的使用方法 public static void list_test(){ ArrayList<Object> array = new ArrayList<Object>(); array.add("八戒你瘦了!"

双向列表增删改

单向链表只能从一个方向遍历链表,即只能查找结点的下一个结点(后继结点),而不能查找结点的上一个结点(前驱结点).鉴于上述问题,引入了双向链表.由于双向循环链表包含双向链表的所有功能操作.因此,我们只讲述双向循环链表. 与单向链表不同,双向链表的结点构造如下图所示.即一个结点由三个部分组成,数据域DATA,左指针域pre和右指针域next.其中,数据域用来存放结点数据信息,左指针域用来指向前驱结点,右指针域用来指向后继结点. 代码如下: package com.qdcz.breadth.demo;