鏈表是有序的列表,可是它在內存中是存儲以下:java
- 鏈表是以節點的方式來存儲的,是鏈式存儲。
- 每一個節點包含data域,next域:指向下一個節點。
- 如圖:鏈表的各個節點不必定是連續存儲的。
- 鏈表分帶頭節點的鏈表和沒有頭節點的鏈表,根據實際需求來肯定。
單鏈表(帶頭結點)邏輯結構示意圖:ide
/** * @Author Fu~Qiang * @Time 2021-3-13 19:06:46 * @Version 1.0 * <p>Description:單鏈表</p> */ public class SingleLinkedListDemo { public static void main(String[] args) { // 測試 HeroNode heroNode1 = new HeroNode(1,"宋江","及時雨"); HeroNode heroNode2 = new HeroNode(2,"盧俊義","玉麒麟"); HeroNode heroNode3 = new HeroNode(3,"吳用","智多星"); HeroNode heroNode4 = new HeroNode(4,"林沖","豹子頭"); //建立鏈表 SingleLinkedList singleLinkedList = new SingleLinkedList(); //加入 singleLinkedList.add(heroNode2); singleLinkedList.add(heroNode1); singleLinkedList.add(heroNode3); singleLinkedList.add(heroNode4); singleLinkedList.list(); } } //定義一個SingleLinkedList來管理英雄 class SingleLinkedList { //先初始化一個頭節點 private HeroNode head = new HeroNode(0,"",""); //添加節點到單向鏈表方法 //當不考慮編號的順序時,找到當前鏈表最後的節點,將最後這個節點的next指向新的節點 public void add(HeroNode heroNode) { HeroNode temp = head; //遍歷鏈表,找到最後 while(true) { if(temp.next == null) { break; } temp = temp.next; } //當退出while循環時,temp就指向了鏈表的最後 temp.next = heroNode; } //顯示鏈表 public void list() { //判斷鏈表是否爲null if(head.next == null) { System.out.println("鏈表爲空~~"); return; } HeroNode temp = head.next; while(true) { //是否到鏈表最後 if(temp == null) { break; } //輸出節點信息 System.out.println(temp); //將next後移 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; } //重寫toString @Override public String toString() { // TODO Auto-generated method stub return "HeroNode [no="+no+",name="+name+",nickName="+nickName+"]"; } }
/** * @Author Fu~Qiang * @Time 2021-3-13 19:06:46 * @Version 1.0 * <p>Description:單鏈表</p> */ public class SingleLinkedListDemo { public static void main(String[] args) { // 測試 HeroNode heroNode1 = new HeroNode(1,"宋江","及時雨"); HeroNode heroNode2 = new HeroNode(2,"盧俊義","玉麒麟"); HeroNode heroNode3 = new HeroNode(3,"吳用","智多星"); HeroNode heroNode4 = new HeroNode(4,"林沖","豹子頭"); //建立鏈表 SingleLinkedList singleLinkedList = new SingleLinkedList(); //加入 singleLinkedList.add(heroNode2); singleLinkedList.add(heroNode1); singleLinkedList.add(heroNode3); singleLinkedList.add(heroNode4); singleLinkedList.list(); // singleLinkedList.addByOrder(heroNode2); // singleLinkedList.addByOrder(heroNode1); // singleLinkedList.addByOrder(heroNode4); // singleLinkedList.addByOrder(heroNode3); // singleLinkedList.list(); } } //定義一個SingleLinkedList來管理英雄 class SingleLinkedList { //先初始化一個頭節點 private HeroNode head = new HeroNode(0,"",""); //添加節點到單向鏈表方法 //當不考慮編號的順序時,找到當前鏈表最後的節點,將最後這個節點的next指向新的節點 public void add(HeroNode heroNode) { HeroNode temp = head; //遍歷鏈表,找到最後 while(true) { if(temp.next == null) { break; } temp = temp.next; } //當退出while循環時,temp就指向了鏈表的最後 temp.next = heroNode; } //第二種添加英雄的方法 public void addByOrder(HeroNode heroNode) { HeroNode temp = head; boolean flag = false; while(true) { if(temp.next == null) {//鏈表最後 break; } if(temp.next.no > heroNode.no) { break; }else if(temp.next.no == heroNode.no) {//編號已存在 flag = true; break; } temp = temp.next; } if(flag) {//flag=true,編號已存在,不能添加 System.out.printf("準備插入的英雄的編號 %d 已經存在",heroNode.no); }else { //插入到鏈表中 heroNode.next = temp.next; temp.next = heroNode; } } //顯示鏈表 public void list() { //判斷鏈表是否爲null if(head.next == null) { System.out.println("鏈表爲空~~"); return; } HeroNode temp = head.next; while(true) { //是否到鏈表最後 if(temp == null) { break; } //輸出節點信息 System.out.println(temp); //將next後移 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; } //重寫toString @Override public String toString() { // TODO Auto-generated method stub return "HeroNode [no="+no+",name="+name+",nickName="+nickName+"]"; } }
//修改節點的信息,根據編號來修改,編號不能修改 public void edit(HeroNode heroNode) { //判斷是否爲空 if(head.next == null) { System.out.println("鏈表爲空~~"); return; } HeroNode temp = head.next; boolean flag = false; while(true) { if(temp == null) { //到鏈表的最後 break; } //找到須要修改的節點 if(temp.no == heroNode.no) { flag = true; break; } temp = temp.next; } if(flag) { temp.name = heroNode.name; temp.nickName = heroNode.nickName; }else{ System.out.printf("沒有找到編號%d的節點,不能修改\n",heroNode.no); } }
//刪除節點 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; } temp = temp.next;//temp後移,遍歷 } if(flag) { temp.next=temp.next.next; }else{ System.out.printf("要刪除的%d不存在,沒法刪除",no); } }