</pre> 本人android工程师一枚,工作闲暇之余,巩固一下java基础,写写双连表玩儿玩儿;<p></p><p><span style="white-space:pre"></span>先说一下思想:</p><p><span style="white-space:pre"></span>1.双连表,故名思意,因此pre属性和next属性就成为了必要属性;</p><p><span style="white-space:pre"></span>2.可从头或者从尾部添加数据,此处贴出从尾部添加版本;</p><p><span style="white-space:pre"></span>3.提供CRUD方法;</p><p><span style="white-space:pre"></span></p><p><span style="white-space:pre"></span>首先,一个双连表的话,java实现可以在内部维护一个节点类:</p><p></p><pre name="code" class="java"><span> </span>/**
* 节点类
*
* @author Luoxiang
*
*/
private static class Node {
// 上一个
Node pre;
// 数据
Object data;
// 下一个
Node next;
}
其次,在当前类中需要维护两个节点,一个头结点head,一个尾节点rear;
<span style="white-space:pre"> </span>/**
* 头结点
*/
private Node head;
/**
* 尾节点
*/
private Node rear;
提供增删改差方法:
<span style="white-space:pre"> </span>/**
* 添加数据的方法
*
* @param data
* 数据
*/
public void add(Object data) {
Node node = new Node();
node.data = data;
/**
* 如果头结点等于null 说明还没有数据 头结点和尾节点都是当前节点
*/
if (head == null) {
head = node;
rear = node;
} else {
/**
* 默认从尾部添加
*/
rear.next = node;
node.pre = rear;
rear = node;
}
}
<span style="white-space:pre"> </span>/**
* 删除方法
* @param data 需要删除的数据
* @return 返回true删除成功
*/
public boolean delete(Object data) {
Node temp = find(data);
//当节点等于空的时候,直接返回
if (temp == null) {
return false;
}
if (temp == head && temp == rear) {
//当节点既是头结点也是尾节点的时候,直接置空头结点和尾节点
head = null;
rear = null;
}else if (temp == head) {
//当节点只是头节点的时候,头结点向后移动一位
head = head.next;
}else if (temp == rear) {
//当节点只是尾节点的时候,尾节点前移一位,尾节点的上一个节点的next属性置空
rear.pre.next = null;
rear = rear.pre;
}else {
/**
* 其余情况说明当前的节点是中间的节点
* 当前节点的上一个节点的next属性指向当前节点的下一个节点
* 当前节点的下一个节点的pre属性指向当前节点的上一个节点
* 删掉当前节点
*/
temp.pre.next = temp.next;
temp.next.pre = temp.pre;
temp = null;
}
return true;
}
<span style="white-space:pre"> </span>/**
* 改数据,默认从头结点开始遍历,更改第一个
* @param oldData 老数据
* @param newData 新数据
* @return true更改成功
*/
public boolean update(Object oldData , Object newData) {
Node temp = find(oldData);
boolean result = false;
if (temp != null) {
temp.data = newData;
result = true;
}
return result;
}
<span style="white-space:pre"> </span>/**
* 查询方法 是否包含这个数据
*
* @param data
* 需要查询的数据
* @return true 包含数据
*/
public boolean contains(Object data) {
return find(data) != null;
}
最后,加入测试代码测试:
<span style="white-space:pre"> </span>public static void main(String[] args) {
DoubleLink doubleLink = new DoubleLink();
doubleLink.add("abc");
doubleLink.add("dfadfad");
doubleLink.add(1234);
doubleLink.add("这个是什么");
doubleLink.add(2.2222);
System.out.println(doubleLink);
System.out.println(doubleLink.contains(1234));
System.out.println(doubleLink);
System.out.println(doubleLink.update(1234 , 123));
System.out.println(doubleLink);
System.out.println(doubleLink.delete(123));
System.out.println(doubleLink);
}
输出结果:
此处,没有提供泛型限制和实现增强for循环版本的,如果需要泛型和增强for循环版本的(有处理模拟栈结构的方法),请自行下载:http://download.csdn.net/download/ynztlxdeai/9601447
欢迎交流!