ASP源码.NET源码PHP源码JSP源码JAVA源码DELPHI源码PB源码VC源码VB源码Android源码

数据结构之双向链表(1/2)

来源:网络整理     时间:2015-12-28     关键词:

本篇文章主要介绍了"数据结构之双向链表",主要涉及到方面的内容,对于Javajrs看球网直播吧_低调看直播体育app软件下载_低调看体育直播感兴趣的同学可以参考一下: 本来这次博文要介绍Handler、Message、Looper之间的关系的,但是,我觉得,在讲这个之前我觉得有必要讲一下列表,因为什么呢?我这是为了...

      本来这次博文要介绍Handler、Message、Looper之间的关系的,但是,我觉得,在讲这个之前我觉得有必要讲一下列表,因为什么呢?我这是为了,下面讲Handler、Message、Looper之间的关系时,需要用到,因为Handler里有个消息队列用到了链表。 好了,咱么开门见山,下面我们就开始来看看双向列表如何实现:

     这个代码也是比较简单的,首先不要怪我直接贴代码,因为这个用文字来描述感觉很晦涩,所以我会以代码跟图的结合方式来说:

首先我们来说说双向列表的添加方法:

/**
	 * 添加节点数据
	 * @param data
	 */
	public void add(Object data){
		//将数据封装到节点里面去
		Node node = new Node(data);
		if(head == null){//①
			//如果head为空,那么node是不是就是头节点,head、rear都指向它
			head = node;
			rear = node;
		}else{//否则,那么就代表不为空,要么往前加,要么往后加

			rear.next = node;
			node.prev = rear;
			rear = node;

		}
	}
下面用一副图来帮助理解:

数据结构之双向链表

那么接下来,我就来看看删除的方法:

/**
	 * 查找节点
	 * @param data
	 */
	private Node find(Object data){
		Node node = head;
		while(node != null){
			if(node.data.equals(data) && node.data.hashCode() == data.hashCode()){//找到了
				break;
			}else{//没找到,指向下一个
				node = node.next;
			}
		}
		return node;
	}
	/**
	 * 删除节点
	 * @param data
	 */
	public void remove(Object data){
		Node node = find(data);
		if(node != null){
			if(node == head && node == rear){//找到,删除
				head = null;
				rear = null;
			}else if(node == head){//头节点
				head = head.next;
				head.prev = null;
			}else if(node == rear){//尾节点
				rear = rear.prev;
				rear.next = null;
			}else{//中间节点
				head.prev.next = node.next;
				head.next.prev = node.prev;

			}

		}
	}

同样是一段code,我相信大家应该看的懂,加上了注释应该好理解,下面同样用一幅图来表示:

数据结构之双向链表

我相信有了图,应该很好理解,对吧。对大家来说理解起来应该更加清晰。当然,如果你需要实现迭代的功能,你也可以实现Iteratorable接口,这里我也为大家实现了这一个功能,不过这里我会贴出全部代码:因为这样看起来更加全面。

相关图片

相关文章