日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

链表(Linked List)之双向链表

發(fā)布時間:2023/12/20 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 链表(Linked List)之双向链表 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

雙向鏈表應(yīng)用實(shí)例

使用帶head頭的雙向鏈表實(shí)現(xiàn) –水滸英雄排行榜

管理單向鏈表的缺點(diǎn)分析:

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

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

示意圖幫助理解刪除

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

分析 雙向鏈表的遍歷,添加,修改,刪除的操作思路 ===》代碼實(shí)現(xiàn)

  • 遍歷 方和 單鏈表一樣,只是可以向前,也可以向后查找 2) 添加 (默認(rèn)添加到雙向鏈表的最后)
  • - (1) 先找到雙向鏈表的最后這個節(jié)點(diǎn) - (2) temp.next = newHeroNode - (3) newHeroNode.pre = temp;
  • 修改 思路和 原來的單向鏈表一樣. 4) 刪除
  • - (1) 因?yàn)槭请p向鏈表,因此,我們可以實(shí)現(xiàn)自我刪除某個節(jié)點(diǎn) - (2) 直接找到要刪除的這個節(jié)點(diǎn),比如temp - (3) temp.pre.next = temp.next - (4) temp.next.pre = temp.pre;

    代碼實(shí)現(xiàn)

    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("雙向鏈表的測試");// 先創(chuàng)建節(jié)點(diǎn)HeroNode2 hero1 = new HeroNode2(1, "宋江", "及時雨");HeroNode2 hero2 = new HeroNode2(2, "盧俊義", "玉麒麟");HeroNode2 hero3 = new HeroNode2(3, "吳用", "智多星");HeroNode2 hero4 = new HeroNode2(4, "林沖", "豹子頭");// 創(chuàng)建一個雙向鏈表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();}}// 創(chuàng)建一個雙向鏈表的類 class DoubleLinkedList {// 先初始化一個頭節(jié)點(diǎn), 頭節(jié)點(diǎn)不要動, 不存放具體的數(shù)據(jù)private HeroNode2 head = new HeroNode2(0, "", "");// 返回頭節(jié)點(diǎn)public HeroNode2 getHead() {return head;}// 遍歷雙向鏈表的方法// 顯示鏈表[遍歷]public void list() {// 判斷鏈表是否為空if (head.next == null) {System.out.println("鏈表為空");return;}// 因?yàn)轭^節(jié)點(diǎn),不能動,因此我們需要一個輔助變量來遍歷HeroNode2 temp = head.next;while (true) {// 判斷是否到鏈表最后if (temp == null) {break;}// 輸出節(jié)點(diǎn)的信息System.out.println(temp);// 將temp后移, 一定小心temp = temp.next;}}// 添加一個節(jié)點(diǎn)到雙向鏈表的最后.public void add(HeroNode2 heroNode) {// 因?yàn)閔ead節(jié)點(diǎn)不能動,因此我們需要一個輔助遍歷 tempHeroNode2 temp = head;// 遍歷鏈表,找到最后while (true) {// 找到鏈表的最后if (temp.next == null) {//break;}// 如果沒有找到最后, 將將temp后移temp = temp.next;}// 當(dāng)退出while循環(huán)時,temp就指向了鏈表的最后// 形成一個雙向鏈表temp.next = heroNode;heroNode.pre = temp;}// 修改一個節(jié)點(diǎn)的內(nèi)容, 可以看到雙向鏈表的節(jié)點(diǎn)內(nèi)容修改和單向鏈表一樣// 只是 節(jié)點(diǎn)類型改成 HeroNode2public void update(HeroNode2 newHeroNode) {// 判斷是否空if (head.next == null) {System.out.println("鏈表為空~");return;}// 找到需要修改的節(jié)點(diǎn), 根據(jù)no編號// 定義一個輔助變量HeroNode2 temp = head.next;boolean flag = false; // 表示是否找到該節(jié)點(diǎn)while (true) {if (temp == null) {break; // 已經(jīng)遍歷完鏈表}if (temp.no == newHeroNode.no) {// 找到flag = true;break;}temp = temp.next;}// 根據(jù)flag 判斷是否找到要修改的節(jié)點(diǎn)if (flag) {temp.name = newHeroNode.name;temp.nickname = newHeroNode.nickname;} else { // 沒有找到System.out.printf("沒有找到 編號 %d 的節(jié)點(diǎn),不能修改\n", newHeroNode.no);}}// 從雙向鏈表中刪除一個節(jié)點(diǎn),// 說明// 1 對于雙向鏈表,我們可以直接找到要刪除的這個節(jié)點(diǎn)// 2 找到后,自我刪除即可public void del(int no) {// 判斷當(dāng)前鏈表是否為空if (head.next == null) {// 空鏈表System.out.println("鏈表為空,無法刪除");return;}HeroNode2 temp = head.next; // 輔助變量(指針)boolean flag = false; // 標(biāo)志是否找到待刪除節(jié)點(diǎn)的while (true) {if (temp == null) { // 已經(jīng)到鏈表的最后break;}if (temp.no == no) {// 找到的待刪除節(jié)點(diǎn)的前一個節(jié)點(diǎn)tempflag = true;break;}temp = temp.next; // temp后移,遍歷}// 判斷flagif (flag) { // 找到// 可以刪除// temp.next = temp.next.next;[單向鏈表]temp.pre.next = temp.next;// 這里我們的代碼有問題?// 如果是最后一個節(jié)點(diǎn),就不需要執(zhí)行下面這句話,否則出現(xiàn)空指針if (temp.next != null) {temp.next.pre = temp.pre;}} else {System.out.printf("要刪除的 %d 節(jié)點(diǎn)不存在\n", no);}}}// 定義HeroNode2 , 每個HeroNode 對象就是一個節(jié)點(diǎn) class HeroNode2 {public int no;public String name;public String nickname;public HeroNode2 next; // 指向下一個節(jié)點(diǎn), 默認(rèn)為nullpublic HeroNode2 pre; // 指向前一個節(jié)點(diǎn), 默認(rèn)為null// 構(gòu)造器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 + "]";}}

    原文鏈接:傳送門

    總結(jié)

    以上是生活随笔為你收集整理的链表(Linked List)之双向链表的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。