双向链表及其操作

  1 package linkedlist;
  2 
  3 public class DoubleLinkedListDemo {
  4 
  5     public static void main(String[] args) {
  6         System.out.println("雙向鏈表的測試");
  7         HeroNode2 hero1 = new HeroNode2(1, "唐僧", "师傅");
  8         HeroNode2 hero2 = new HeroNode2(2, "孙悟空", "大师兄");
  9         HeroNode2 hero3 = new HeroNode2(3, "猪八戒", "二师兄");
 10         HeroNode2 hero4 = new HeroNode2(4, "沙和尚", "三师弟");
 11 
 12         DoubleLinkedList doubleLinkedList = new DoubleLinkedList();
 13         doubleLinkedList.add(hero1);
 14         doubleLinkedList.add(hero2);
 15         doubleLinkedList.add(hero3);
 16         doubleLinkedList.add(hero4);
 17 
 18         HeroNode2 newHeroNode = new HeroNode2(2, "六耳猕猴", "假悟空");
 19         doubleLinkedList.update(newHeroNode);
 20 
 21         doubleLinkedList.list();
 22 
 23     }
 24 
 25 }
 26 
 27 class DoubleLinkedList {
 28     private HeroNode2 head = new HeroNode2(0, "", "");
 29 
 30     public HeroNode2 getHead() {
 31         return head;
 32     }
 33 
 34     // 遍历双向链表
 35     public void list() {
 36         if (head.next == null) {
 37             System.out.println("链表为空");
 38             return;
 39         }
 40         HeroNode2 temp = head.next;
 41         while (true) {
 42             if (temp == null) {
 43                 break;
 44             }
 45             System.out.println(temp);
 46             temp = temp.next;
 47         }
 48     }
 49 
 50     // 添加一个节点到双向链表的最后
 51     public void add(HeroNode2 heronode) {
 52         // 因为head节点不能动,因此我们需要一个辅助遍历temp
 53         HeroNode2 temp = head;
 54         while (true) {
 55             if (temp.next == null) {
 56                 break;
 57             }
 58             temp = temp.next;
 59         }
 60         // 形成双向链表
 61         temp.next = heronode;
 62         heronode.pre = temp;
 63     }
 64 
 65     // 修改一个节点的内容,可以看到和单向链表的一样
 66     // 只是节点类型改变
 67     public void update(HeroNode2 newHeroNode) {
 68 
 69         if (head.next == null) {
 70             System.out.println("链表为空~");
 71             return;
 72         }
 73         HeroNode2 temp = head.next;
 74         boolean flag = false;
 75         while (true) {
 76             if (temp == null) {
 77                 break;// 已经遍历完列表
 78             }
 79             if (temp.no == newHeroNode.no) {
 80                 flag = true;
 81                 break;
 82             }
 83             temp = temp.next;
 84         }
 85         // 根据flag,判断是否找到要修改的节点
 86         if (flag) {
 87             temp.name = newHeroNode.name;
 88             temp.nickname = newHeroNode.nickname;
 89         } else {
 90             System.out.println("没有找到编号为" + newHeroNode.no + "的节点,不能修改");
 91         }
 92 
 93     }
 94 
 95     // 方向链表的删除
 96     // 1.对于双向链表,我们可以直接找到要删除的这个节点
 97     // 2.找到以后自我删除
 98     public void del(int no) {
 99         if (head.next == null) {
100             System.out.println("链表为空,无法删除");
101             return;
102         }
103 
104         HeroNode2 temp = head.next;
105 
106         boolean flag = false;
107         while (true) {
108             if (temp == null) {// 链表最后
109                 break;
110             }
111             if (temp.no == no) {
112                 flag = true;
113                 break;
114             }
115             temp = temp.next;
116         }
117         if (flag) {
118             temp.pre.next = temp.next;
119             // 如果是最后一个节点,就不需要执行下面这句话,否则出现空指针
120             if (temp != null) {
121                 temp.next.pre = temp.pre;
122             }
123 
124         } else {
125             System.out.println("要删除的节点" + no + "不存在");
126         }
127     }
128 
129 }
130 
131 class HeroNode2 {
132     public int no;
133     public String name;
134     public String nickname;
135     public HeroNode2 next;// 指向下一个节点
136     public HeroNode2 pre;// 默认为null
137     // 构造器
138 
139     public HeroNode2(int no, String name, String nickname) {
140         super();
141         this.no = no;
142         this.name = name;
143         this.nickname = nickname;
144     }
145 
146     // 重写toString
147     @Override
148     public String toString() {
149         return "HeroNode [no=" + no + ", name=" + name + ", nickname=" + nickname + "]";
150 
151     }
152 
153 }
原文地址:https://www.cnblogs.com/-xuewuzhijing-/p/12887219.html