1. 程式人生 > 其它 >資料結構與演算法之雙鏈表

資料結構與演算法之雙鏈表

技術標籤:資料結構資料結構

雙鏈表

使用帶head頭的雙向連結串列實現 –水滸英雄排行榜
管理單向連結串列的缺點分析:
1、單向連結串列,查詢的方向只能是一個方向,而雙向連結串列可以向前或者向後查詢。
2、單向連結串列不能自我刪除,需要靠輔助節點 ,而雙向連結串列,則可以自我刪除,所以前面我們單鏈表刪除時節點,總是找到temp,temp是待刪除節點的前一個節點.

分析雙向連結串列的遍歷,新增,刪除,修改操作
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

在這裡插入圖片描述
程式碼實現

class HeroNode2{
    public int no;
    public String name;
    public String nickname;
    public HeroNode2 next;
    public HeroNode2 pre;
public HeroNode2(){ } public HeroNode2(int no,String name,String nickname){ this.no=no; this.name=name; this.nickname=nickname; } @Override public String toString() { return "HeroNode{" + "no=" + no + ", name='"
+ name + '\'' + ", nickname='" + nickname + '\'' + '}'; } } class doubleLinked{ private HeroNode2 head=new HeroNode2(1,"",""); public HeroNode2 getHead(){ return head; } //遍歷 public void showList(HeroNode2 head){ if (head==null){ return; } HeroNode2 temp=head.next; while (temp!=null){ System.out.println(temp); temp=temp.next; } } //新增元素 public void addNode(HeroNode2 node2){ HeroNode2 temp=head; while (true){ if (temp.next==null){ break; } temp=temp.next; } temp.next=node2; node2.pre=temp; } //修改 public void update(HeroNode2 newNode){ HeroNode2 temp=head.next; boolean flag=true; while (true){ if (temp==null){ break; }else if (temp.no==newNode.no){ flag=false; break; } temp=temp.next; } if (!flag){ temp.no=newNode.no; temp.name=newNode.name; temp.nickname=newNode.nickname; } } //刪除 public void delete(int no){ HeroNode2 temp=head.next; boolean flag=true; while (true){ if (temp==null){ break; } else if (temp.no==no){ flag=false; break; } temp=temp.next; } if (!flag){ //考慮刪除最後一個節點 temp.pre.next=temp.next; //如果下一個節點不等於空就執行 if (temp.next!=null){ temp.next.pre=temp.pre; } } else { System.out.println("不存在這個節點"); } } } public class doubleLinkedListDemo { public static void main(String[] args) { HeroNode2 heroNode1 = new HeroNode2(1, "宋江", "及時雨"); HeroNode2 heroNode2 = new HeroNode2(2, "盧俊義", "玉麒麟"); HeroNode2 heroNode3 = new HeroNode2(9, "吳用", "智多星"); HeroNode2 heroNode4 = new HeroNode2(4, "林沖", "豹子頭"); HeroNode2 heroNode5 = new HeroNode2(111, "林沖", "豹子頭"); doubleLinked dll = new doubleLinked(); dll.addNode(heroNode1); dll.addNode(heroNode2); dll.addNode(heroNode3); dll.addNode(heroNode4); dll.addNode(heroNode5); // dll.showList(dll.getHead()); // dll.update(newnode); // dll.showList(dll.getHead()); dll.delete(111); dll.showList(dll.getHead()); // dll.showList(dll.getHead()); } }