<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
相較單連結串列,雙向連結串列除了data與next域,還多了一個pre域用於表示每個節點的前一個元素。這樣做給雙向連結串列帶來了很多優勢:
單向連結串列查詢的方向只能是一個方向,而雙向連結串列可以向前或者向後查詢;
單連結串列如果想要實現刪除操作,需要找到待刪除節點的前一個節點。而雙向連結串列可以實現自我刪除。
雙向連結串列結構示意圖如下:
與單連結串列實現類似,交集部分不再贅述,詳情可參考文章:Java資料結構:單連結串列的實現與面試題彙總
遍歷:
與單連結串列遍歷方式一樣,同時,雙向連結串列可以支援向前和向後兩種查詢方式
新增:
新增到末尾
按照no順序新增
修改操作與單連結串列實現步驟一致
刪除操作:
以刪除紅色的2號節點為例:
/** * @author 興趣使然黃小黃 * @version 1.0 * 學生類節點 */ public class StudentNode { public String no; //學號 public String name; //姓名 public int age; //年齡 public StudentNode pre; //指向前一個節點 public StudentNode next; //指向下一個節點 //構造器 public StudentNode(String no, String name, int age ){ this.no = no; this.name = name; this.age = age; } //為了顯示方便 @Override public String toString() { return "StudentNode{" + "no='" + no + ''' + ", name='" + name + ''' + ", age=" + age + '}'; } }
/** * @author 興趣使然黃小黃 * @version 1.0 * 學生雙向連結串列的具體實現 */ public class StudentDoubleLinkedList { //定義頭節點 private StudentNode head = new StudentNode("", "", 0); //獲取頭節點 public StudentNode getHead(){ return head; } //遍歷雙向連結串列的方法 public void showList(){ //判斷連結串列是否為空 if (head.next == null){ System.out.println("當前連結串列為空"); return; } //遍歷 使用輔助指標 StudentNode temp = head; while (temp != null){ //更新指標 temp = temp.next; if (temp.next == null){ System.out.print(temp); break; } System.out.print(temp + "--->"); } } //新增節點的方法 //新增到尾部 public void add(StudentNode newNode){ //先找到最後一個節點 StudentNode cur = head; while (true){ //到達最後退出迴圈 if (cur.next == null){ break; } //更新指標 cur = cur.next; } //新增操作 newNode.next = cur.next; //也可以省略,因為恆為null cur.next = newNode; newNode.pre = cur; } //新增節點的方法 //根據學號順序新增 public void addByOrder(StudentNode newNode){ //如果當前連結串列為空,則直接新增 if (head.next == null){ head.next = newNode; newNode.pre = head; return; } //按照學號找到對應位置 StudentNode cur = head; boolean flag = false; //標識待新增的no是否存在 while (true){ if (cur.next == null){ //已經到達連結串列的尾部 break; } else if (Integer.parseInt(cur.next.no) == Integer.parseInt(newNode.no)){ //已經存在 flag = true; break; }else if (Integer.parseInt(cur.next.no) > Integer.parseInt(newNode.no)){ //位置找到 break; } cur = cur.next; } if (flag){ System.out.println("當前no已經存在,無法新增!"); }else { //新增操作 newNode.next = cur.next; cur.next = newNode; newNode.pre = cur; } } //根據no學號修改學生資訊 public void update(StudentNode studentNode){ if (head.next == null){ System.out.println("當前連結串列為空, 無法修改"); return; } StudentNode temp = head.next; boolean flag = false; //表示是否找到節點 while (true){ if (temp == null){ break; } if (temp.no == studentNode.no){ flag = true; break; } temp = temp.next; } if (flag){ temp.name = studentNode.name; temp.age = studentNode.age; System.out.println("更新成功!"); }else { System.out.println("沒有找到"); } } //從雙向連結串列中刪除節點 public void delete(String no){ //直接找到對應no的節點直接刪除 StudentNode cur = head.next; boolean flag = false; //標記是否找到 while (true){ if (cur == null){ break; } if (cur.no.equals(no)){ flag = true; //找到了 break; } cur = cur.next; } if (flag){ //刪除操作 //注意考慮最後一個節點後一個為空的情況 if (cur.next != null) { cur.next.pre = cur.pre; } cur.pre.next = cur.next; System.out.println("刪除成功!"); }else { System.out.println( no + "節點不存在,無法刪除!"); } } }
/** * @author 興趣使然黃小黃 * @version 1.0 * 雙向連結串列測試類 */ public class DoubleLinkedListDemo { public static void main(String[] args) { StudentDoubleLinkedList doubleLinkedList = new StudentDoubleLinkedList(); doubleLinkedList.addByOrder(new StudentNode("1", "黃小黃", 20)); doubleLinkedList.addByOrder(new StudentNode("3", "懶羊羊", 20)); doubleLinkedList.addByOrder(new StudentNode("2", "沸羊羊", 25)); doubleLinkedList.addByOrder(new StudentNode("4", "美羊羊", 15)); System.out.println("遍歷:"); doubleLinkedList.showList(); //測試更新方法 System.out.println("n更新編號為4的資訊後:"); doubleLinkedList.update(new StudentNode("4", "禰豆子", 14)); doubleLinkedList.showList(); //測試刪除方法 System.out.println("n刪除第一個和最後一個:"); doubleLinkedList.delete("1"); doubleLinkedList.delete("4"); doubleLinkedList.showList(); } }
遍歷:
StudentNode{no='1', name='黃小黃', age=20}--->StudentNode{no='2', name='沸羊羊', age=25}--->StudentNode{no='3', name='懶羊羊', age=20}--->StudentNode{no='4', name='美羊羊', age=15}
更新編號為4的資訊後:
更新成功!
StudentNode{no='1', name='黃小黃', age=20}--->StudentNode{no='2', name='沸羊羊', age=25}--->StudentNode{no='3', name='懶羊羊', age=20}--->StudentNode{no='4', name='禰豆子', age=14}
刪除第一個和最後一個:
刪除成功!
刪除成功!
StudentNode{no='2', name='沸羊羊', age=25}--->StudentNode{no='3', name='懶羊羊', age=20}
Process finished with exit code 0
單向連結串列查詢的方向只能為一個方向,雙向連結串列解決了這個缺點,可以實現雙向查詢;
單連結串列進行刪除操作必須找到待刪除元素的前一個元素,才能完成刪除操作。而雙向連結串列就簡單多了,只需要找到待刪除的節點,進行自我刪除;
本節介紹了雙向連結串列的遍歷、新增、按順序新增、更新、刪除方法的實現,可以嘗試像單連結串列篇一樣,嘗試求有效節點數量,以及如何逆序輸出雙向連結串列加強練習!
以上就是Java資料結構之雙向連結串列的實現的詳細內容,更多關於Java資料結構雙向連結串列的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45