数据结构--双链表

一、 管理单向链表的缺点分析:

1) 单向链表,查找的方向只能是一个方向,而双向链表可以向前或者向后查找。

2) 单向链表不能自我删除,需要靠辅助节点 ,而双向链表,则可以自我删除,所以前面我们单链表删除时节点,总是找到 temp,temp 是待删除节点的前一个节点.

二、 双向链表如何完成遍历,添加,修改和删除的思路

1、遍历:

1) 遍历 和 单链表一样,只是可以向前,也可以向后查找

2、添加 (默认添加到双向链表的最后)

(1) 先找到双向链表的最后这个节点

(2) temp.next = newHeroNode

(3) newHeroNode.pre = temp;

3、修改 思路和 原来的单向链表一样.

4、删除

(1) 因为是双向链表,因此,我们可以实现自我删除某个节点

(2) 直接找到要删除的这个节点,比如 temp

(3) temp.pre.next = temp.next

(4) temp.next.pre = temp.pre;(需要判断是否是最后一个节点,不然会报空指针异常)

三、代码

Node节点类

 1 package domain;
 2 
 3 
 4 //双向链表节点
 5 public class DoubleHeroNode {
 6     public Integer no;
 7     public String name;
 8     public String nickName;
 9     public DoubleHeroNode nextNode;
10     public DoubleHeroNode preNode;
11 
12     public DoubleHeroNode() {
13     }
14 
15     public DoubleHeroNode(Integer no, String name, String nickName) {
16         this.no = no;
17         this.name = name;
18         this.nickName = nickName;
19     }
20 
21     @Override
22     public String toString() {
23         return "HeroNode{" +
24                 "no=" + no +
25                 ", name='" + name + '\'' +
26                 ", nickName='" + nickName + '\'' +
27                 '}';
28     }
29 }

实现类

 1 package serve;
 2 
 3 import domain.DoubleHeroNode;
 4 import domain.HeroNode;
 5 
 6 public class DoubleLinkListServe {
 7     DoubleHeroNode  headNode = new DoubleHeroNode();
 8 
 9     //遍历双向链表
10     public void printList(){
11         DoubleHeroNode tempNode = headNode;
12         if(tempNode.nextNode == null){
13             System.out.println("空链表");
14             return;
15         }
16         while(true){
17             if(tempNode.nextNode == null){
18                 break;
19             }
20             System.out.println(tempNode.nextNode);
21             tempNode = tempNode.nextNode;
22         }
23     }
24 
25     //在尾部添加
26     public void addNode(DoubleHeroNode newNode){
27         DoubleHeroNode tempNode = headNode;
28     //遍历找到最后一个节点
29         while (tempNode.nextNode != null) {
30             tempNode = tempNode.nextNode;
31         }
32         tempNode.nextNode = newNode;
33         newNode.preNode = tempNode;
34     }
35 
36     //根据no删除
37     public void delNode(int no){
38         DoubleHeroNode tempNode = headNode;
39         //找到标识
40         boolean flag = false;
41         if(tempNode.nextNode == null){
42             System.out.println("空链表");
43             return;
44         }
45         while(true){
46             if(tempNode.nextNode == null){
47                 break;
48             }
49             if(tempNode.nextNode.no == no){
50                 flag = true;
51                 tempNode =  tempNode.nextNode;
52                 break;
53             }
54             tempNode =  tempNode.nextNode;
55         }
56         if(flag){
57             tempNode.preNode.nextNode = tempNode.nextNode;
58             // 如果是最后一个节点,就不需要执行下面这句话,否则出现空指针
59             if(tempNode.nextNode != null){
60                 tempNode.nextNode.preNode= tempNode.preNode;
61             }
62         }else {
63             System.out.println("未找到该编号的节点");
64         }
65     }
66 
67 }

测试类

 1 public class DoubleLinkListDemo {
 2     public static void main(String[] args) {
 3         DoubleLinkListServe doubleLinkListServe = new DoubleLinkListServe();
 4 
 5         DoubleHeroNode heroNode1 = new DoubleHeroNode(1,"宋江","及时雨");
 6         DoubleHeroNode heroNode2 = new DoubleHeroNode(2,"卢俊义","玉麒麟");
 7         DoubleHeroNode heroNode3 = new DoubleHeroNode(3,"吴用","智多星");
 8         DoubleHeroNode heroNode4 = new DoubleHeroNode(4,"林冲","豹子头");
 9 
10         //添加节点
11         doubleLinkListServe.addNode(heroNode1);
12         doubleLinkListServe.addNode(heroNode2);
13         doubleLinkListServe.addNode(heroNode3);
14         doubleLinkListServe.addNode(heroNode4);
15         //遍历节点
16         doubleLinkListServe.printList();
17 
18 
19         //删除节点
20         doubleLinkListServe.delNode(3);
21         //遍历节点
22         doubleLinkListServe.printList();
23 
24     }
25 }

总结

 

posted @ 2022-05-06 08:34  jason饼干大怪兽  阅读(27)  评论(0)    收藏  举报