資料結構與演算法之雙鏈表
阿新 • • 發佈:2020-12-10
雙鏈表
使用帶head頭的雙向連結串列實現 –水滸英雄排行榜
管理單向連結串列的缺點分析:
1、單向連結串列,查詢的方向只能是一個方向,而雙向連結串列可以向前或者向後查詢。
2、單向連結串列不能自我刪除,需要靠輔助節點 ,而雙向連結串列,則可以自我刪除,所以前面我們單鏈表刪除時節點,總是找到temp,temp是待刪除節點的前一個節點.
分析雙向連結串列的遍歷,新增,刪除,修改操作
1、遍歷和單鏈表一樣,只是可以向前,也可以向後查詢
2、新增(預設新增到雙鏈表的最後這個節點)
1)先找到雙向連結串列的最後這個節點
2)temp.next=newHeroNode
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());
}
}