Java實現(xiàn)帶頭結(jié)點的單鏈表
鏈表的特點
1,以節(jié)點方式存儲,是鏈?zhǔn)浇Y(jié)構(gòu)。
2,每個節(jié)點包含data域,next域:指向下一個節(jié)點。
3,鏈表的各個節(jié)點不一定是連續(xù)存儲。
4,鏈表分為帶頭節(jié)點和不帶頭節(jié)點兩種類型的鏈表。
實現(xiàn)原理
添加節(jié)點:如下圖所示,首先遍歷原有鏈表,找到最后一個節(jié)點,將要增加的節(jié)點添加到該節(jié)點的后面。下面介紹如何找到最后一個節(jié)點。
思路是這樣的,先遍歷整個鏈表,定義一個輔助變量temp,用于暫時存儲遍歷出來的各個節(jié)點。首先將head頭節(jié)點賦給temp(從頭節(jié)點開始遍歷),通過一個死循環(huán)不斷的遍歷節(jié)點的next,直到temp.next==null時,該節(jié)點temp就是鏈表的最后一個節(jié)點,只需要將該節(jié)點的next指向新增節(jié)點就行了。
修改節(jié)點:首先遍歷整個鏈表,通過傳入的編號去匹配原有的鏈表的編號,找到對應(yīng)的編號將節(jié)點里面的數(shù)據(jù)替換即可。
刪除節(jié)點:如圖所示,要刪除某一節(jié)點,需要遍歷整個鏈表,找到該節(jié)點對應(yīng)的編號,再將該前一個節(jié)點的next指向要刪除的節(jié)點的后面的一個節(jié)點,即(temp.next = temp.next.next)。由于被刪除的節(jié)點沒有被引用,將會被垃圾回收機(jī)制回收掉。
主要代碼
package cn.mrlij.linkedlist; /*** * 單鏈表的實現(xiàn) * @author dreamer * */ public class SingleLinkedList { public static void main(String[] args) { SingleLinkedListDemo s = new SingleLinkedListDemo(); HeroNode h1 = new HeroNode(1, "宋江", "及時雨"); HeroNode h2 = new HeroNode(3, "盧俊義", "玉麒麟"); HeroNode h3 = new HeroNode(4, "吳用", "智多星"); HeroNode h4 = new HeroNode(2, "林沖", "豹子頭"); s.addByOrder(h1); s.addByOrder(h2); s.addByOrder(h3); s.addByOrder(h4); System.out.println("修改前————"); s.list(); // HeroNode h5 = new HeroNode(4, "有用", "超星星"); // s.update(h5); s.del(1); s.del(4); s.del(2); s.del(3); System.out.println("刪除后————"); s.list(); } } class SingleLinkedListDemo{ //創(chuàng)建一個頭結(jié)點,初始化數(shù)據(jù),頭結(jié)點不要動,不放具體的數(shù)據(jù) private HeroNode head = new HeroNode(0,"",""); //添加英雄 public void add(HeroNode node) { //先找出最后的一個節(jié)點,把新加的節(jié)點放在最后一個節(jié)點的后面 HeroNode temp = head; while(true) { if(temp.next == null) { break; } temp = temp.next; } temp.next = node; } public void addByOrder(HeroNode node) { HeroNode temp = head; boolean flag = false; while(true) { if(temp.next == null) { break; } if(temp.next.no>node.no) { break; }else if(temp.next.no == node.no) { flag = true; break; } temp = temp.next; } if(flag) { System.out.println("編號"+node.no+"已經(jīng)存在了!"); }else { node.next = temp.next; temp.next = node; } } public void update(HeroNode node ) { if(head.next == null) { System.out.println("鏈表為空!"); return; } HeroNode temp = head.next; boolean flag = false; while(true) { if(temp == null) { break; } if(temp.no == node.no) { flag = true; break; } temp = temp.next; } if(flag) { temp.name = node.name; temp.nickname = node.name; }else { System.out.println("不存在該節(jié)點!"); } } //刪除節(jié)點 public void del(int no) { if(head.next == null) { System.out.println("鏈表為空!"); return; } HeroNode temp = head; boolean flag = false; while(true) { if(temp.next == null) { break; } if(temp.next.no == no) { flag = true; break; } temp = temp.next; } if(flag) { temp.next = temp.next.next; }else { System.out.println("該節(jié)點不存在!"); } } public void list() { HeroNode temp = head; if(temp.next == null) { System.out.println("鏈表為空!"); return; } while(true) { if(temp.next == null) { break; } System.out.println(temp.next); temp = temp.next; } } } class HeroNode{ public int no;//英雄編號 public String name;//人名 public String nickname;//綽號 public HeroNode next;//下一個節(jié)點 public HeroNode(int no, String name, String nickname) { this.no = no; this.name = name; this.nickname = nickname; } @Override public String toString() { return "HeroNode [no=" + no + ", name=" + name + ", nickname=" + nickname + "]"; } }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
MyBatis Plus實現(xiàn)一對多的查詢場景的三種方法
MyBatis Plus提供了多種簡便的方式來進(jìn)行一對多子查詢,本文主要介紹了MyBatis Plus實現(xiàn)一對多的查詢場景的三種方法,具有一定的參考價值,感興趣的可以了解一下2024-07-07Nacos啟動出現(xiàn)failed to req API:/nacos/v1/ns/insta
這篇文章主要介紹了Nacos啟動出現(xiàn)failed to req API:/nacos/v1/ns/instance after all servers問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08關(guān)于IDEA2020.1新建項目maven PKIX 報錯問題解決方法
這篇文章主要介紹了關(guān)于IDEA2020.1新建項目maven PKIX 報錯問題解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06java實現(xiàn)在性能測試中進(jìn)行業(yè)務(wù)驗證實例
這篇文章主要為大家介紹了java實現(xiàn)在性能測試中進(jìn)行業(yè)務(wù)驗證實例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07mybatis使用foreach遍歷list集合或者array數(shù)組方式
這篇文章主要介紹了mybatis使用foreach遍歷list集合或者array數(shù)組方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07SpringBoot自定義Starter實現(xiàn)流程詳解
SpringBoot中的starter是一種非常重要的機(jī)制,能夠拋棄以前繁雜的配置,將其統(tǒng)一集成進(jìn)starter,應(yīng)用者只需要在maven中引入starter依賴,SpringBoot就能自動掃描到要加載的信息并啟動相應(yīng)的默認(rèn)配置。starter讓我們擺脫了各種依賴庫的處理,需要配置各種信息的困擾2022-09-09java 裝飾模式(Decorator Pattern)詳解
這篇文章主要介紹了java 裝飾模式(Decorator Pattern)詳解的相關(guān)資料,需要的朋友可以參考下2016-10-10