鏈表(Linked List)之雙向鏈表

雙向鏈表應用實例

使用帶head頭的雙向鏈表實現 –水滸英雄排行榜

管理單向鏈表的缺點分析:

單向鏈表,查找的方向只能是一個方向,而雙向鏈表可以向前或者向后查找。

單向鏈表不能自我刪除,需要靠輔助節點 ,而雙向鏈表,則可以自我刪除,所以前面我們單鏈表刪除時節點,總是找到temp,temp是待刪除節點的前一個節點(認真體會).

示意圖幫助理解刪除

嗶哩嗶哩動畫

課堂作業和思路提示:雙向鏈表的第二種添加方式,按照編號順序 [示意圖] 按照單鏈表的順序添加,稍作修改即可.

img

分析 雙向鏈表的遍歷,添加,修改,刪除的操作思路 ===》代碼實現

  1. 遍歷 方和 單鏈表一樣,只是可以向前,也可以向后查找 2) 添加 (默認添加到雙向鏈表的最后)
- (1) 先找到雙向鏈表的最后這個節點
- (2) temp.next = newHeroNode
- (3) newHeroNode.pre = temp;
  1. 修改 思路和 原來的單向鏈表一樣. 4) 刪除
- (1) 因為是雙向鏈表,因此,我們可以實現自我刪除某個節點
- (2) 直接找到要刪除的這個節點,比如temp
- (3)  temp.pre.next = temp.next
- (4) temp.next.pre = temp.pre;

代碼實現

package com.atguigu.linkedlist;/*** ClassName:  <br/>* Description:  <br/>* Date: 2021-02-19 14:32 <br/>* @project data_algorithm* @package com.atguigu.linkedlist*/
public class DoubleLinkedListDemo {public static void main(String[] args) {// 測試System.out.println("雙向鏈表的測試");// 先創建節點HeroNode2 hero1 = new HeroNode2(1, "宋江", "及時雨");HeroNode2 hero2 = new HeroNode2(2, "盧俊義", "玉麒麟");HeroNode2 hero3 = new HeroNode2(3, "吳用", "智多星");HeroNode2 hero4 = new HeroNode2(4, "林沖", "豹子頭");// 創建一個雙向鏈表DoubleLinkedList doubleLinkedList = new DoubleLinkedList();doubleLinkedList.add(hero1);doubleLinkedList.add(hero2);doubleLinkedList.add(hero3);doubleLinkedList.add(hero4);doubleLinkedList.list();// 修改HeroNode2 newHeroNode = new HeroNode2(4, "公孫勝", "入云龍");doubleLinkedList.update(newHeroNode);System.out.println("修改后的鏈表情況");doubleLinkedList.list();// 刪除doubleLinkedList.del(3);System.out.println("刪除后的鏈表情況~~");doubleLinkedList.list();}}// 創建一個雙向鏈表的類
class DoubleLinkedList {// 先初始化一個頭節點, 頭節點不要動, 不存放具體的數據private HeroNode2 head = new HeroNode2(0, "", "");// 返回頭節點public HeroNode2 getHead() {return head;}// 遍歷雙向鏈表的方法// 顯示鏈表[遍歷]public void list() {// 判斷鏈表是否為空if (head.next == null) {System.out.println("鏈表為空");return;}// 因為頭節點,不能動,因此我們需要一個輔助變量來遍歷HeroNode2 temp = head.next;while (true) {// 判斷是否到鏈表最后if (temp == null) {break;}// 輸出節點的信息System.out.println(temp);// 將temp后移, 一定小心temp = temp.next;}}// 添加一個節點到雙向鏈表的最后.public void add(HeroNode2 heroNode) {// 因為head節點不能動,因此我們需要一個輔助遍歷 tempHeroNode2 temp = head;// 遍歷鏈表,找到最后while (true) {// 找到鏈表的最后if (temp.next == null) {//break;}// 如果沒有找到最后, 將將temp后移temp = temp.next;}// 當退出while循環時,temp就指向了鏈表的最后// 形成一個雙向鏈表temp.next = heroNode;heroNode.pre = temp;}// 修改一個節點的內容, 可以看到雙向鏈表的節點內容修改和單向鏈表一樣// 只是 節點類型改成 HeroNode2public void update(HeroNode2 newHeroNode) {// 判斷是否空if (head.next == null) {System.out.println("鏈表為空~");return;}// 找到需要修改的節點, 根據no編號// 定義一個輔助變量HeroNode2 temp = head.next;boolean flag = false; // 表示是否找到該節點while (true) {if (temp == null) {break; // 已經遍歷完鏈表}if (temp.no == newHeroNode.no) {// 找到flag = true;break;}temp = temp.next;}// 根據flag 判斷是否找到要修改的節點if (flag) {temp.name = newHeroNode.name;temp.nickname = newHeroNode.nickname;} else { // 沒有找到System.out.printf("沒有找到 編號 %d 的節點,不能修改\n", newHeroNode.no);}}// 從雙向鏈表中刪除一個節點,// 說明// 1 對于雙向鏈表,我們可以直接找到要刪除的這個節點// 2 找到后,自我刪除即可public void del(int no) {// 判斷當前鏈表是否為空if (head.next == null) {// 空鏈表System.out.println("鏈表為空,無法刪除");return;}HeroNode2 temp = head.next; // 輔助變量(指針)boolean flag = false; // 標志是否找到待刪除節點的while (true) {if (temp == null) { // 已經到鏈表的最后break;}if (temp.no == no) {// 找到的待刪除節點的前一個節點tempflag = true;break;}temp = temp.next; // temp后移,遍歷}// 判斷flagif (flag) { // 找到// 可以刪除// temp.next = temp.next.next;[單向鏈表]temp.pre.next = temp.next;// 這里我們的代碼有問題?// 如果是最后一個節點,就不需要執行下面這句話,否則出現空指針if (temp.next != null) {temp.next.pre = temp.pre;}} else {System.out.printf("要刪除的 %d 節點不存在\n", no);}}}// 定義HeroNode2 , 每個HeroNode 對象就是一個節點
class HeroNode2 {public int no;public String name;public String nickname;public HeroNode2 next; // 指向下一個節點, 默認為nullpublic HeroNode2 pre; // 指向前一個節點, 默認為null// 構造器public HeroNode2(int no, String name, String nickname) {this.no = no;this.name = name;this.nickname = nickname;}// 為了顯示方法,我們重新toString@Overridepublic String toString() {return "HeroNode [no=" + no + ", name=" + name + ", nickname=" + nickname + "]";}}

原文鏈接:傳送門

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/455102.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/455102.shtml
英文地址,請注明出處:http://en.pswp.cn/news/455102.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

H264 解碼耗時分析

在數字基帶處理器上代碼的最佳放置 美國模擬器件公司 Jose Fridman   在手機等嵌入式系統中&#xff0c;除了處理器執行時間外&#xff0c;最重要的資源就是設備總線和存儲器接口。本文將介紹一種在使用指令高速緩存時其帶寬消耗的基礎上&#xff0c;統計分析高速緩存所采用…

CentOS 7 使用iptables防火墻

# 停止firewalld服務 systemctl stop firewalld systemctl mask firewalld # 安裝iptables-services yum install iptables-services Enable the service at boot-time: # 啟動iptables服務 systemctl enable iptables # 管理iptables systemctl [stop|start|restart] ip…

Linux命令之useradd和userdel(添加、刪除用戶)

一、【useradd】&#xff1a;添加用戶命令 1.作用useradd或adduser命令用來建立用戶帳號和創建用戶的起始目錄&#xff0c;使用權限是超級用戶。 2.格式 useradd [-d home] [-s shell] [-c comment] [-m [-k template]] [-f inactive] [-e expire ] [-p passwd] [-r] name 3.主…

鏈表(Linked List)之環形鏈表

原文地址:傳送門 單向環形鏈表應用場景 Josephu(約瑟夫、約瑟夫環) 問題 Josephu 問題為&#xff1a;設編號為1&#xff0c;2&#xff0c;… n的n個人圍坐一圈&#xff0c;約定編號為k&#xff08;1<k<n&#xff09;的人從1開始報數&#xff0c;數到m 的那個人出列&…

springboot 單測加入參數_spring-boot-單元測試參數數

簡單案例RunWith(Parameterized.class)public class ParameterTest {// 2.聲明變量存放預期值和測試數據private String firstName;private String lastName;//3.聲明一個返回值 為Collection的公共靜態方法&#xff0c;并使用Parameters進行修飾Parameterized.Parameterspubli…

H.264/AVC 標準中CAVLC 和CABAC 熵編碼算法研究

http://www.paper.edu.cn/index.php/default/releasepaper/downPaper/200903-146

python ==》 元組

為何要有元組 &#xff0c;() 可存放多個值 元組不可變 更多的是用來查詢t (1,[1,3],sss,(1,2)) #t tuple(1,[1,3],sss,(1,2))print (type(t))元組可以作為字典的keyd{(1,2,3):zcx}print(d,type(d),d[(1,2,3)])索引取值d (1,2,3,4,5)print(d[1])切片goods (iphone,lenove,…

免費SSL證書(支持1.0、1.1、1.2)

由于公司要開發微信小程序&#xff0c;而微信小程序的接口需要https協議的&#xff0c;并且要支持TLS1.0、TLS1.1、TLS1.2。如果僅僅是為了開發小程序&#xff0c;安全等級又不用太高&#xff0c;可以選擇免費的SSL證書 在這里選擇騰訊云的證書&#xff0c;申請在 https://cons…

viewsource和viewparsed_Network Panel說明

一、chrome Developer Tools&#xff1a;Network Panel從網絡面板中可以獲取很多有用信息&#xff0c;如詳細的時間數據&#xff0c;http請求頭響應頭&#xff0c;cookies&#xff0c;WebSocket數據。通過分析這些數據&#xff0c;可以知道哪個資源加載耗時最久&#xff0c;誰發…

使用棧來完成一個表達式的結果

原文地址:傳送門 使用棧來完成一個表達式的結果 使用棧完成計算 一個表達式的結果 7*2*2-51-53-4 &#xff1f; 32*6-2[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-XzPnJzRe-1614845779689)(https://victorfengming.gitee.io/data_algorithm/i…

JM與h264標準中的關鍵字說明

有些亂&#xff0c;先存著&#xff0c;留著看 如何結合H.264標準看JM代碼》這個web文件&#xff0c;大家都應該有了吧。不過&#xff0c;那個web文檔是“H.264樂園”群中聊天的內容 1、一個sps后&#xff0c;有若干個pps嗎&#xff1f; 這主要又編碼器決定&#xff0c;但J…

云計算(cloud computing)十大問答

本文講的是云計算&#xff08;cloud computing&#xff09;十大問答&#xff0c;【IT168 資訊】云計算這個新名詞最近甚囂塵上&#xff0c;最近周圍不少朋友都在談&#xff0c;有必要寫一個關于云計算的科普了。  一般的業界比較喜歡用一些新名詞來體現 自己的戰略眼光和與對…

3150cdn打印機清零 hl_兄弟HL-3150/3140彩色打印機粉盒清零方法,我們提前了解一下...

原標題&#xff1a;兄弟HL-3150/3140彩色打印機粉盒清零方法&#xff0c;我們提前了解一下對于兄弟品牌的打印機&#xff0c;相信各位經銷商朋友都遇到過&#xff0c;更換新的粉盒或者加粉后還會提示墨粉不足、更換碳粉盒、更換硒鼓。這個情況需要在機器上操作清零&#xff01;…

Python 關于bytes類方法對數字轉換的誤區, Json的重要性

本文起源于一次犯錯, 在發覺bytes()里面可以填數字, 轉出來的也是bytes類型, 就心急把里面的東西decode出來. 結果為空.搞來搞去以為是命令不熟練事實上錯在邏輯.a1 bytes(11, encodingutf-8) print(a1)b1 a1.decode()print(b1)a2 bytes(11) print(a2)b2 a2.decode() print…

前綴中綴后綴表達式的計算求值

原文在這里 表達式 前綴表達式(波蘭表達式) 前綴表達式又稱波蘭式,前綴表達式的運算符位于操作數之前舉例說明&#xff1a; (34)5-6 對應的前綴表達式就是 - 3 4 5 6 前綴表達式求值 前綴表達式的計算機求值 從右至左掃描表達式&#xff0c;遇到數字時&#xff0c;將數…

psnr 計算

PSNR是“Peak Signal to Noise Ratio”的縮寫&#xff0c;峰值信噪比。psnr一般是用于最大值信號和背景噪音之間的一個工程項目。 PSNR計算公式如下&#xff1a; 8bits表示法中&#xff0c;peak的最大值為255&#xff1b;MSE指Mean Square Error&#xff08;均方誤差&#xff0…

光源時間_縮短背光源的使用壽命的原因

許多場所都會使用到led這種產品&#xff0c;這種產品經常用于背光的照亮中。但是由于使用led的局限性較大&#xff0c;所以led逐漸被背光源這種產品所代替&#xff0c;常常用于背景的照亮讓宣傳圖可以展現出更好的視覺&#xff0c;這也是許多人選擇背光源的原因。那么&#xff…

《結對-貪吃蛇-需求分析》

結對編程&#xff1a;貪吃蛇項目 準備階段&#xff1a;安裝Python、pygame 編寫階段&#xff1a;1. 設置游戲窗口 2. 設置游戲必要功能&#xff1a; a)開始、暫停、退出按鈕 b)貪吃蛇身體 c)食物 d)移動貪吃蛇所需按鍵 3. 完善游戲&#xff1a;添加游戲時間、貪吃蛇失敗次數…

視頻中場的問題2009-04-03 19:38(一)

視頻中場的問題2009-04-03 19:38(一) 場的用途&#xff1a; 讓25幀/秒的電視畫面幀速率&#xff0c;變為50幀/秒。使觀眾感受到更加流暢的畫面。 (二) 場的由來&#xff1a; 在電視制作的時候&#xff0c;電視掃描一副畫面的時間根據當地交流電源的頻率來確定。比如中國交流電源…

遞歸應用場景和調用機制

原文鏈接:傳送門 遞歸 迷宮問題(回溯) 概念 簡單吶的說: 遞歸就是方法自己調用自己,每次調用時傳入不同的變量,遞歸有助于編程者解決復雜的問題,同時讓代碼變得簡潔. 案例-遞歸調用機制 打印問題 public static void test(int n){if(n>2){test(n-1);}System.out.print…