java实现双连表

</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

欢迎交流!


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值