資料結構小白之雙向鍊錶

2021-09-25 01:12:07 字數 3129 閱讀 8406

之前整理過一篇關於單向鍊錶的資料:

單向鍊錶的缺點分析:

1.單向鍊錶,查詢的方向只能是乙個方向,而雙向鍊錶可以向前或者向後去查詢

2.單向鍊錶不能進行自我刪除,需要借助輔助節點(借助temp 就是待刪除節點的前乙個節點),而雙向鍊錶則可以進行自我刪除

3.示意圖:

關於雙向鍊錶的遍歷,新增,修改,刪除

1.遍歷:

*和單向鍊錶一致

//遍歷雙向鍊錶的方法

public void showlist()

//因為頭節點不能動,因此我們需要乙個輔助變數來遍歷

heronode2 tempnode = head;

while (true)

//輸出節點的資訊

system.out.println(tempnode.next);

tempnode = tempnode.next;}}

2.新增

*先找到單向鍊錶的倒數第二個節點(temp.next==null),然後進行新增

//新增乙個節點到雙向鍊錶的最後

public void add(heronode2 heronode)

//未找到 temp後移

temp = temp.next;

}//當退出while迴圈時,temp指向了鍊錶的最後

//關聯雙向鍊錶

temp.next = heronode;

heronode.pre = temp;

}

3.修改節點:

*和單向鍊錶一致

public void update(heronode2 newheronode) 

//找到需要修改的節點資訊,根據no 編號

//定義乙個輔助變數

heronode2 temp = head.next;

boolean flag = false;

while (true)

if (temp.no == newheronode.no)

temp = temp.next;

}if (flag) else

}

4.刪除節點

*在單向鍊錶中,需要找到待刪除節點的前乙個節點,才可以通過temp.next=temp.next.next的方法進行刪除

*而在雙向鍊錶中,只需要找到待刪除節點即可,再通過自我刪除的方式

自我刪除**

**tempnode.pre.next = tempnode.next;

//有風險

// 如果要刪除最後乙個節點,就不需要執行下面這句話,否則會出現空指標異常

tempnote.next.pre

if(tempnode.next!=null)**

public void deletenode(int no) 

heronode2 tempnode = head.next;//輔助節點

boolean flag = false;

while (true)

if (tempnode.no == no)

tempnode = tempnode.next;

}if (flag)

} else

}

雙向鍊錶操作的完整**:
public class doublelinkedlistdemo 

}class doublelinkedlist

public void sethead(heronode2 head)

//遍歷雙向鍊錶的方法

public void showlist()

//因為頭節點不能動,因此我們需要乙個輔助變數來遍歷

heronode2 tempnode = head;

while (true)

//輸出節點的資訊

system.out.println(tempnode.next);

tempnode = tempnode.next;}}

//新增乙個節點到雙向鍊錶的最後

public void add(heronode2 heronode)

//未找到 temp後移

temp = temp.next;

}//當退出while迴圈時,temp指向了鍊錶的最後

//關聯雙向鍊錶

temp.next = heronode;

heronode.pre = temp;

}//修改乙個節點的內容,雙向鍊錶修改節點和單向鍊錶**一致

public void update(heronode2 newheronode)

//找到需要修改的節點資訊,根據no 編號

//定義乙個輔助變數

heronode2 temp = head.next;

boolean flag = false;

while (true)

if (temp.no == newheronode.no)

temp = temp.next;

}if (flag) else

}//從雙向鍊錶中刪除乙個節點

/*** 對於雙向鍊錶,可以直接找到要刪除的這個節點

* 找到後,自我刪除即可

*/public void deletenode(int no)

heronode2 tempnode = head.next;//輔助節點

boolean flag = false;

while (true)

if (tempnode.no == no)

tempnode = tempnode.next;

}if (flag)

} else

}}class heronode2

@override

public string tostring() ';}}

資料結構之雙向鍊錶

簡述 指標域有乙個指標 而言,占用資源更大,但相應的 雙向鍊錶遍歷的時候只需要乙個指標就可以,而且 只有得到其中任何乙個節點就是得到整個鍊錶,單向鍊錶必須得到他的頭節點,才能遍歷整個鍊錶,而且得有兩個指標。實現 bothwaylinklist.h ifndef mymodule h define m...

資料結構之 雙向鍊錶

單鏈表的結點都只有乙個指向下乙個結點的指標。單鏈表的資料元素無法直接訪問其前驅元素。建立鍊錶 銷毀鍊錶 獲取鍊錶長度 清空鍊錶 獲取第pos個元素操作 插入元素到位置pos 刪除位置pos處的元素 dlinklist dlinklist creat 建立乙個鍊錶 void dlinklist des...

資料結構之雙向鍊錶

雙向鍊錶宛如一列火車,剛發明的時候只有乙個頭,如果它的行駛路線為 a b c d e f g h i j k a 這個時候有一批貨物需要從k運到j,那麼它的運輸路線一定是 k a b c d e f g h i j 所以後來火車就有了兩個頭,由此可見雙向鍊錶的重要性!雙向鍊錶 在單鏈表結點上增添了乙...