双向链表
概述
在单链表的基础上,每个节点多了一个pre域,用来指向该节点的前趋节点。双向链表的第一个节点的前趋节点为null,最后一个节点的后继节点为null
实现思路
大多数思路和单链表差不多,唯独有两处:删除、排序添加。以上两个功能实现的时候,要考虑遍历到最后一个节点才符合条件的情况,要判断临时节点的next是否为空,防止空指针异常。
因为与单链表的情况不同的是,向两个节点中间插入、删除节点的时候,除了next要处理,还需要后继节点的pre域要处理,这时临时节点如果指向末尾的节点,即temp.next为空,这时如果让临时节点的后继节点指向新节点,或指向临时节点的前趋节点,则会空指针异常,因为此时临时节点的后继节点为空。
实现代码
package linked_list;
public class DoubleNode {
public int no;
public String name;
public DoubleNode next;
public DoubleNode pre;
public DoubleNode(int no, String name) {
this.no = no;
this.name = name;
}
@Override
public String toString() {
return "DoubleNode{" +
"no=" + no +
", name='" + name + '\'' +
'}';
}
}
package linked_list;
public class DoubleLinkedList {
public static void main(String[] args) {
DoubleNode node1 = new DoubleNode(1,"张三");
DoubleNode node2 = new DoubleNode(2,"李四");
DoubleNode node3 = new DoubleNode(3,"王五");
DoubleLinkedList linkedList = new DoubleLinkedList();
linkedList.addBySort(node2);
linkedList.addBySort(node1);
linkedList.addBySort(node3);
linkedList.show();
System.out.println("======修改=======");
DoubleNode node4 = new DoubleNode(3,"王五2");
linkedList.update(node4);
linkedList.show();
System.out.println("======删除=======");
linkedList.delete(3);
linkedList.show();
}
DoubleNode headNode = new DoubleNode(0, "");
//根据序号no进行排序添加,如果序号相同,则提示失败
//添加到链表中间而非末尾
public void addBySort(DoubleNode doubleNode){
DoubleNode tempNode = headNode;
//true表示已经存在此序号
boolean flag = false;
while (tempNode.next != null){
if (tempNode.next.no > doubleNode.no){
break;
} else if (tempNode.next.no == doubleNode.no){
flag = true;
break;
}
tempNode = tempNode.next;
}
if (flag){
System.out.println("该序号节点已存在");
}else {
//添加到temp指向的节点之后
if (tempNode.next != null){
tempNode.next.pre = doubleNode;
}
doubleNode.next = tempNode.next;
tempNode.next = doubleNode;
doubleNode.pre = tempNode;
}
}
//删除
public void delete(int no) {
DoubleNode tempNode = headNode.next;
boolean flag = false;
while (tempNode != null) {
if (no == tempNode.no){
//找到了
flag = true;
break;
}
tempNode = tempNode.next;
}
if (flag){
tempNode.pre.next = tempNode.next;
if (tempNode.next != null) {
tempNode.next.pre = tempNode.pre;
}
}else {
System.out.println("不存在"+no+"号的节点");
}
}
//修改
public void update(DoubleNode node) {
DoubleNode tempNode = headNode;
boolean flag = false;
while (tempNode.next != null) {
if (node.no == tempNode.next.no){
//找到了
flag = true;
break;
}
tempNode = tempNode.next;
}
if (flag){
tempNode.next.name = node.name;
}else {
System.out.println("不存在"+node.no+"号的节点");
}
}
//添加节点到尾
public void addTail(DoubleNode doubleNode){
DoubleNode tempNode = headNode;
while (tempNode.next != null){
tempNode = tempNode.next;
}
tempNode.next = doubleNode;
doubleNode.pre = tempNode;
}
//展示链表
public void show(){
if (headNode.next == null){
System.out.println("链表为空===");
return;
}
DoubleNode tempNode = headNode;
while (tempNode.next != null){
System.out.println(tempNode.next);
tempNode = tempNode.next;
}
}
}