1. 程式人生 > 其它 >雙向連結串列示意圖_Java資料結構——雙向連結串列

雙向連結串列示意圖_Java資料結構——雙向連結串列

技術標籤:雙向連結串列示意圖

背景問題:

  • 1、管理單向連結串列查詢的方向只能有一個。
  • 2、單向連結串列不能自我刪除,刪除不方便

雙向連結串列示意圖

8540a289960e21cd8592da1a03de5200.png

注意:

  • 每一個雙向連結串列都有兩個頭節點,一個pre(指向前一個節點);next(指向後一個節點)

雙向連結串列的增刪改查

增加資料:

思路:

  • 1、先遍歷雙線連結串列找到最後一個節點(temp)
  • 2、temp.next = newHeroNode
  • 3、newHeroNode.pre = temp

刪除資料:

思路:

  • 遍歷雙向連結串列,找到要刪除的節點(temp)
  • temp.pre.next = temp.next
  • temp.next.pre = temp.pre

注意:

  • 第二步與第三步道理相同,很好理解,先找到temp的前一個節點tempPre 把前一個節點的next改成temp的限一個節點(tempNext)

查詢資料:

思路:

  • 直接遍歷雙向連結串列找到要查詢陣列的編號

修改資料:

思路:

  • 1、直接遍歷雙向連結串列找到要查詢陣列的編號
  • 2、temp.name = ???

程式碼實現

public class DoubleLinkedListText {
    public static void main(String[] args) {
        DoublieLinkedList dll = new DoublieLinkedList();

        HeroNode h1 = new HeroNode(1,"劉玄德");
        HeroNode h2 = new HeroNode(2,"關雲長");
        HeroNode h3 = new HeroNode(3,"張翼德");
        HeroNode h4 = new HeroNode(4,"諸葛亮");

        dll.add(h1);
        dll.add(h2);
        dll.add(h3);
        dll.add(h4);

        dll.showAll();

        dll.delete(3);

        dll.showAll();
    }
}

class DoublieLinkedList{
    private static HeroNode head = new HeroNode(0,"");

    public static HeroNode getHead() {
        return head;
    }

    //新增英雄
    /*
    * 1、遍歷連結串列找到最後這個節點temp
    * 2、temp.next = herpNode
    * 3、heroNode.pre = temp*/
    public void add(HeroNode heroNode){
        HeroNode temp = head;
        while (true){
            //找到最後那個節點
            if (temp.next==null){
                temp.next = heroNode;
                heroNode.pre = temp ;
                break;
            }
            temp = temp.next;
        }
    }

    //按順序新增英雄
    /*
    * */

    //刪除英雄
    /*
    * 1、遍歷連結串列,找到編號為num的節點temp
    * 2、temp.pre.next = temp.next
    * 3、temp.next.pre = temp.pre
    * */
    public void delete(int num){
        if (head.next==null){
            System.out.println("連結串列為空!");
        }
        HeroNode temp = head.next;
        while (true){
            if (temp.num == num){
                temp.pre.next = temp.next;
                temp.next.pre = temp.pre;
                break;
            }
            temp = temp.next;
        }
    }

    //遍歷連結串列
    public void showAll(){
        if (head.next==null){
            System.out.println("連結串列為空!");
            return;
        }
        HeroNode temp = head.next;
        while (true){
            if (temp==null){
                break;
            }
            System.out.println(temp);
            temp = temp.next;
        }
    }
}

class HeroNode{
    public int num;
    public String name ;
    public HeroNode pre;
    public HeroNode next ;
    //建構函式
    public HeroNode(int num,String name){
        this.num = num ;
        this.name = name;
    }

    //重寫toString方法
    @Override
    public String toString() {
        return "HeroNode{" +
                "num=" + num +
                ", name='" + name + ''' +
                '}';
    }
}