public class DoubleLinkedList {
private Node headNode = new Node(0,"head");
public Node getHeadNode() {
return headNode;
}
// 1、尾部添加 ---- 与单向链表一样,只不过需将新节点的前引用指向之前的最后一个节点
public void add(Node node){
// 由于不能修改头节点,创建临时节点
Node temp = headNode;
while (true){
if(temp.next == null) break; // 当节点的下一个节点为空时,说明该节点是尾部节点
temp = temp.next;
}
temp.next = node;
node.pre = temp;
}
// 2、遍历链表
public void list(){
if(headNode.next == null){
System.out.println("链表为空~");
return;
}
Node temp = headNode;
while (true){
if(temp.next == null) break; // 节点到达最后,跳出循环
System.out.println(temp.next);
temp = temp.next;
}
}
// 3、修改节点 ---- 与单向链表一样
public void update(Node updateNode){
Node temp = headNode.next;
while (true){
if(temp == null){
break;
}
if(temp.no == updateNode.no){
temp.value = updateNode.value;
System.out.println("编号为" + updateNode.no + "的节点数据修改成功!");
return;
}
temp = temp.next;
}
System.out.println("没有找到编号为" + updateNode.no + "的节点,修改失败!");
return;
}
// 4、删除节点 ---- 与单向链表有差别,可以实现自我删除,即不用找删除节点的前一个节点。最后一个节点的删除比较特殊
public void delete(Node node){
Node temp = headNode.next;
while (true){
if(temp == null){
break;
}
if(temp.no == node.no){
temp.pre.next = temp.next;
if(temp.next != null){
temp.next.pre = temp.pre;
}
System.out.println("编号为" + node.no + "的节点删除成功!");
return;
}
temp = temp.next;
}
System.out.println("没有找到编号为" + node.no + "的节点,删除失败!");
return;
}
}
class Node{
public int no; // 编号
public String value; // 节点数据
public Node next; // 下一个节点
public Node pre; // 前一个节点
public Node(int no, String value){
this.no = no;
this.value = value;
}
@Override
public String toString() {
return "Node{" +
"no=" + no +
", value='" + value + '\'' +
'}';
}
}
测试代码:
public class Test {
public static void main(String[] args){
// 双向链表
Node node1 = new Node(1,"liubei");
Node node2 = new Node(2,"guanyu");
Node node3 = new Node(3,"zhangfei");
Node node4 = new Node(4,"machao");
Node node5 = new Node(4,"huangzhong");
Node node6 = new Node(5,"kongming");
DoubleLinkedList doubleLinkedList = new DoubleLinkedList();
// 添加
doubleLinkedList.add(node3);
doubleLinkedList.add(node1);
doubleLinkedList.add(node4);
doubleLinkedList.add(node2);
// 修改
doubleLinkedList.update(node5);
// 删除
doubleLinkedList.delete(node2);
doubleLinkedList.list();
}
}