zoukankan      html  css  js  c++  java
  • 双向链表及其操作

      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 }
  • 相关阅读:
    1035: 相同生日
    1034: 7, 还是7
    1033: 青蛙的约会
    1032: 蛇行矩阵
    1031: 最少钱币数
    1030: 到底买不买
    1029: 挖掘机技术哪家强
    scikit-learn 和pandas 基于windows单机机器学习环境的搭建
    用scikit-learn和pandas学习线性回归
    SimRank协同过滤推荐算法
  • 原文地址:https://www.cnblogs.com/-xuewuzhijing-/p/12887219.html
Copyright © 2011-2022 走看看