java代碼實現(xiàn)雙向鏈表
本文實例為大家分享了雙向鏈表java實現(xiàn)代碼,供大家參考,具體內(nèi)容如下
一、雙向鏈表簡介
1、單鏈表的缺陷
單鏈表只能從頭結點開始訪問鏈表中的數(shù)據(jù)元素,如果需要逆序訪問單鏈表中的數(shù)據(jù)元素將極其低效。
2、雙向鏈表的結構
雙鏈表是鏈表的一種,由節(jié)點組成,每個數(shù)據(jù)結點中都有兩個指針,分別指向直接后繼和直接前驅(qū)。
3、雙向鏈表類的基本結構
class HeroNode2 { ? ? ? ? //編號 ? ? ? ? public int no; ? ? ? ? //名稱 ? ? ? ? public String name; ? ? ? ? //昵稱 ? ? ? ? public String nickName; ? ? ? ? //下個節(jié)點編碼 ? ? ? ? public HeroNode2 next; ? ? ? ? //上一個節(jié)點 ? ? ? ? public HeroNode2 pre; ? ? ? ? ? public HeroNode2(int no, String name, String nickName) { ? ? ? ? ? ? this.no = no; ? ? ? ? ? ? this.name = name; ? ? ? ? ? ? this.nickName = nickName; ? ? ? ? } ? ? ? ? ? public HeroNode2(int no, String name) { ? ? ? ? ? ? this.no = no; ? ? ? ? ? ? this.name = name; ? ? ? ? } ? ? ? ? ? @Override ? ? ? ? public String toString() { ? ? ? ? ? ? return "HeroNode{" + ? ? ? ? ? ? ? ? ? ? "no=" + no + ? ? ? ? ? ? ? ? ? ? ", name='" + name + '\'' + ? ? ? ? ? ? ? ? ? ? ", nickName='" + nickName + '\'' + ? ? ? ? ? ? ? ? ? ? '}'; ? ? ? ? } ? ? }
二、雙向鏈表的操作
1、雙向鏈表的插入操作
//添加節(jié)點到單向鏈表 ? ? ? ? //1. 找到當前鏈表的最后節(jié)點 ? ? ? ? //2. 將最后這個節(jié)點的next指定新節(jié)點 ? ? ? ? public void add(HeroNode2 heroNode) { ? ? ? ? ? ? //因為head節(jié)點不能動,所以需要一個輔助變量temp ? ? ? ? ? ? HeroNode2 temp = head; ? ? ? ? ? ? while (true) { ? ? ? ? ? ? ? ? //根據(jù)是否有下個節(jié)點判斷 是否到了鏈表動最后 ? ? ? ? ? ? ? ? if (temp.next == null) { ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? //如果沒有找到最后 temp后移 ? ? ? ? ? ? ? ? temp = temp.next; ? ? ? ? ? ? } ? ? ? ? ? ? //當退出循環(huán)時,temp就指向了鏈表的最后位置 ? ? ? ? ? ? //當最后這個節(jié)點的next 指向新的節(jié)點 ? ? ? ? ? ? //新節(jié)點的上一個節(jié)點指向temp ? ? ? ? ? ? temp.next = heroNode; ? ? ? ? ? ? heroNode.pre = temp; ? ? ? ? }
2、雙向鏈表的刪除操作
?/** ? ? ? ? ?* 根據(jù)編號刪除節(jié)點 ? ? ? ? ?* 雙向鏈表找到對應的節(jié)點直接刪除 ? ? ? ? ?* @param no 節(jié)點編號 ? ? ? ? ?*/ ? ? ? ? public void deleteByNo(int no) { ? ? ? ? ? ? //判斷是否鏈表為空 ? ? ? ? ? ? if (head.next == null) { ? ? ? ? ? ? ? ? System.out.println("鏈表為空"); ? ? ? ? ? ? ? ? return; ? ? ? ? ? ? } ? ? ? ? ? ? HeroNode2 temp = head; ? ? ? ? ? ? //設置標識 ? ? ? ? ? ? boolean flag = false; ? ? ? ? ? ? while (true) { ? ? ? ? ? ? ? ? //已經(jīng)遍歷到鏈表尾 ? ? ? ? ? ? ? ? if (temp == null) { ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? //找到修改節(jié)點的上一個節(jié)點 ? ? ? ? ? ? ? ? if (temp.no == no) { ? ? ? ? ? ? ? ? ? ? flag = true; ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? temp = temp.next; ? ? ? ? ? ? } ? ? ? ? ? ? ? //找到對應的節(jié)點 ? ? ? ? ? ? if (flag) { ? ? ? ? ? ? ? ? //找到要刪除節(jié)點的上一個節(jié)點 將刪除節(jié)點的下一個節(jié)點 綁定為中間變量的下一個節(jié)點 ? ? ? ? ? ? ? ? temp.pre.next=temp.next; ? ? ? ? ? ? ? ? if (temp.next!=null){ ? ? ? ? ? ? ? ? ? ? temp.next.pre=temp.pre; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? } else { ? ? ? ? ? ? ? ? System.out.println("沒有對應的節(jié)點無法刪除"); ? ? ? ? ? ? } ? ? ? ? } }
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
SpringBoot validator參數(shù)驗證restful自定義錯誤碼響應方式
這篇文章主要介紹了SpringBoot validator參數(shù)驗證restful自定義錯誤碼響應方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10Spring深入分析講解BeanUtils的實現(xiàn)
java知識體系統(tǒng)有很多數(shù)據(jù)實體,比較常用的DTO、BO、DO、VO等,其他類似POJO概念太老了現(xiàn)在基本廢棄掉了,本篇幅直接忽略,對于這幾種數(shù)據(jù)實體各自代表的含義和應用場景先做一下簡單描述和分析2022-06-06Java實現(xiàn)批量向mysql寫入數(shù)據(jù)的方法
這篇文章主要介紹了Java實現(xiàn)批量向mysql寫入數(shù)據(jù)的方法,涉及java基于JDBC連接mysql數(shù)據(jù)庫及寫入數(shù)據(jù)的相關操作技巧,非常簡單實用,需要的朋友可以參考下2017-12-12