双向链表
双向链表相对于单链表来说:
1. 查找的方向不止是一个方向
2. 可以实现自我删除,不需要像单链表一样寻找要删除节点的前一个节点
思路分析:
遍历:和单向链表一致,可以前向,也可以后向。
添加元素到链表最后:
1) 先遍历到这个链表的最后
2) temp.next = newNode; newNode.pre = temp;
按照编号添加元素:
1) 找到要添加的位置的前一个元素temp
2) heroNode.next = temp.next;
3) temp.next = heroNode;
4) heroNode.next.pre = heroNode;
5) heroNode.pre = temp; //这些步骤本质上就是将原来的两根指针变成四根
修改:找到这个节点直接修改就可以
自我删除:
1) 找到这个节点
2) temp.pre.next = temp.next;
temp.next.pre. = temp.pre;
(当删除的节点是最后一个时,后面句话不需要,否则会出现空指针)
代码:
//构建一个双向列表的节点
class Node{
int value;
Node next;
Node pre;
public Node(int value){
this.value = value;
}
@Override
public String toString(){
return "my value is "+value;
}
}
//加入一个元素
public void add(Node nodeIn) {
Node temp = head;
while (true) {
if (temp.next == null) {
break;
}
temp = temp.next;
}
temp.next = nodeIn;
nodeIn.pre = temp;
}
//按序号加入元素
public void addSpecial(Node heroNode){
Node temp = head;
boolean label = false;
while(true){
if(temp.next == null){
break;
}
if(heroNode.value<temp.next.value){
break;
}
if(heroNode.value == temp.next.value){
label = true;
break;
}
temp = temp.next;
}
if(label){
System.out.println("没位置了!爬!");
}else {
heroNode.next = temp.next;
temp.next = heroNode;
heroNode.next.pre = heroNode;
heroNode.pre = temp;
}
}