本篇文章主要介绍了"数据结构之双向链表",主要涉及到方面的内容,对于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接口,这里我也为大家实现了这一个功能,不过这里我会贴出全部代码:因为这样看起来更加全面。