鏈表是有序的列表java
鏈表是以節點的方式來存儲,是鏈式存儲ide
每一個節點包含data域,next域;指向下一個節點測試
鏈表的各個節點不必定是連續存儲this
鏈表分帶頭節點的鏈表和沒有頭節點的鏈表,根據實際需求來肯定指針
單鏈表的增刪改查code
package linkedlist; import javax.swing.plaf.synth.SynthSeparatorUI; public class SingleLinkedListDemo { public static void main(String[] args) { //進行測試 HeroNode hero1 = new HeroNode(1,"宋江","及時雨"); HeroNode hero2 = new HeroNode(2,"盧俊義","玉麒麟"); HeroNode hero3 = new HeroNode(3,"吳用","智多星"); HeroNode hero4 = new HeroNode(4,"林沖","豹子頭"); SingleLinkedList sl = new SingleLinkedList(); // sl.add(hero1); // sl.add(hero2); // sl.add(hero3); // sl.add(hero4); sl.addByOrder(hero1); sl.addByOrder(hero2); sl.addByOrder(hero4); sl.addByOrder(hero3); sl.list(); // HeroNode hn = new HeroNode(3,"小盧","玉麒麟~~"); // sl.updata(hn); sl.del(3); sl.list(); } } //建立SingleLinkedList 管理咱們的英雄 class SingleLinkedList{ //初始化頭節點,頭結點不要動,不存放具體的數據 private HeroNode head = new HeroNode(0,"",""); //添加節點到單向鏈表 //當不考慮編號順序時 //找到當前鏈表的最後節點,將最後節點的next指向新的節點 public void add(HeroNode heroNode) { //由於Head節點不能動,所以咱們須要一個輔助遍歷temp HeroNode temp = head;//temp爲頭指針,臨時變量 //經過遍歷鏈表,找到最後一個節點 //當循環結束之時,就是找到最後一個節點之日 while(true) { if(temp.next==null) {//第一次調用add時temp.next等於null終止循環 break;//爲null就跳出while循環 } //若是沒有找到最後,讓temp日後移動,直到找到null爲止 temp=temp.next;//存儲傳遞進來的heroNode節點temp } //當退出while循環時,temp就指向鏈表最後 temp.next=heroNode;//跳出循環後,將傳遞進來的heroNode節點賦值給臨時變量temp } //第二種方式在添加英雄時,根據排名獎英雄插入到指定位置 public void addByOrder(HeroNode heroNode) { HeroNode temp = head; boolean flag = false; while(true) { if(temp.next == null){//第二次添加英雄,不爲null break; } //假設一開始添加的第一個英雄宋江的編號爲1,第二次添加的英雄編號爲2,則1>2不成立,則執行temp = temp.next; if(temp.next.no>heroNode.no) { break; }else if(temp.next.no == heroNode.no) { flag = true; break; } //把1,宋江,及時雨,null 賦值給temp,這個時候再次執行循環,temp.next爲null, temp = temp.next; } if(flag) { System.out.println(heroNode.no+"號已經存在"); }else { heroNode.next = temp.next;//當第一次添加英雄時,把null賦值給節點heroNode的屬性next temp.next = heroNode;//當第一次添加英雄時,把heroNode節點添加到temp類的屬性next中去 } } //修改節點的信息,根據no編號來修改 public void updata(HeroNode newHeroNode) { //判斷是否爲空 if(head.next == null) { System.out.println("鏈表爲空"); return; } //找到要修改的節點 HeroNode temp = head.next; boolean flag = false; while(true) { if(temp == null) { break; } if(temp.no == newHeroNode.no) { flag = true; break; } System.out.println(temp.next+"測試"); temp = temp.next; } if(flag) { temp.name = newHeroNode.name; temp.nickname=newHeroNode.nickname; }else { System.out.println("沒有找到該編號"); } } //刪除節點 public void del(int no) { HeroNode temp = head; boolean flag = false;//標誌是否找要刪除的節點 while(true) { if(temp.next == null) { break; } if(temp.next.no == no) { flag = true; break; } System.out.println(temp.next+"測試");//宋江 temp = temp.next; System.out.println(temp.next+"測試");//盧俊義 } if(flag) { temp.next = temp.next.next; }else { System.out.println("要刪除的節點不存在"); } } //顯示鏈表 public void list() { //判斷鏈表是否爲null if(head.next==null) { System.out.println("鏈表爲空"); } //由於頭節點不能動,所以須要一個輔助變量來遍歷 HeroNode temp = head.next; while(true) { if(temp==null) { break; } System.out.println(temp); temp=temp.next;//指針後移 } } } //定義HeroNode,每一個HeroNode 對象就是一個節點 class HeroNode{ public int no; public String name; public String nickname; public HeroNode next;//指向下一個節點 //構造器 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 + "]"; } } //這玩意真廢腦子