前言
數據結構是計算機存儲、組織數據的方式。若是不會數據結構,那麼就不可能寫出好的代碼,所以。數據結構是咱們學習編程不可或缺的一部分!鏈表是數據結構中的一種,可是鏈表又分爲單向鏈表,雙向鏈表,循環鏈表,本篇文章主要是聊聊鏈表中的單向鏈表。算法
單向鏈表(single-linked list)概述
一個單鏈表的節點(Node)分爲兩部分,第一個部分(data)保存或者顯示關於節點的信息,另外一個部分儲存下一個節點的地址,最後一個節點的儲存地址部分指向空值。編程
單向表只可向一個方向便利,通常查找一個節點的時候須要從第一個節點開始每次訪問下一個節點,一直訪問到須要的位置。而插入一個節點,對於單向鏈表,咱們只提供在鏈表頭插入,只須要將當前的節點設置爲頭節點,next指向源頭節點便可。刪除一個節點,咱們將該節點的上一個的next指向下一個節點
數據結構
算法分析:
一、按照no找到要修改的編號
二、temp.name=newHeroNode.name;
三、temp.nickName=newHeroNode.nickName;ide
在建立、修改、刪除中所建立的輔助變量temp都是必須的,由於head的值是不能變化的,一旦head發生變化,整個鏈表就會報錯。學習
代碼實現:
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 singleLinkedList = new SingleLinkedList(); //singleLinkedList.add(hero1); //singleLinkedList.add(hero2); //singleLinkedList.add(hero3); //singleLinkedList.add(hero4); singleLinkedList.addByOrder(hero1); singleLinkedList.addByOrder(hero4); singleLinkedList.addByOrder(hero2); singleLinkedList.addByOrder(hero3); singleLinkedList.addByOrder(hero3); System.out.println("修改前:"); singleLinkedList.list(); HeroNode newHeroNode =new HeroNode(2, "小盧", "小麒麟"); singleLinkedList.update(newHeroNode); System.out.println("修改後:"); singleLinkedList.list(); singleLinkedList.delete(hero3); System.out.println("刪除後:"); singleLinkedList.list(); } } class SingleLinkedList{ //先初始化一個頭結點,頭結點不要動,不存放具體數據 private HeroNode head = new HeroNode(0, "", ""); public void add(HeroNode heroNode) { HeroNode temp = head;//定義一個輔助變量來存放head,由於head是不可變的 //遍歷鏈表,找到最後 while(true) { if(temp.next==null) { break;//找到鏈表的最後一個以後。break } //若是沒有找到,就將temp後移,當退除循環時,temp指向鏈表的最後 temp = temp.next; } //temp指向新的節點 temp.next = heroNode; } public void addByOrder(HeroNode heroNode) { HeroNode temp = head; //由於時單鏈表,所以咱們要找的temp是位於插入節點前一個位置的不然插入不了 boolean flag = false;//flag標誌添加的編號是否存在,默認爲false while(true) { if(temp.next==null)//temp已經再鏈表的最後,break break; if(temp.next.no>heroNode.no)//與添加位置的後一位no進行比較,位置已找到 break; else if(temp.next.no==heroNode.no){//說明但願添加的heroNode的編號已經存在 flag = true; break; } temp = temp.next; } if(flag == true) { System.out.printf("準備插入的這個英雄的編號%d已經存在,不能加入",heroNode.no); System.out.println(); } else { //插入到鏈表中 heroNode.next=temp.next; temp.next=heroNode; } } //修改節點的信息,no不能更改 public void update(HeroNode newHeroNode) { if(head.next==null) { System.out.println("LinkedList爲空"); return; } HeroNode temp = head; boolean flag = false; while(true) { if(temp.next==null)//已經遍歷完鏈表 break; if(temp.no==newHeroNode.no) { flag = true; break; } temp = temp.next; } if(flag == true) { temp.name=newHeroNode.name; temp.nickName=newHeroNode.nickName; } else { System.out.printf("沒有找到編號等於%d的節點",newHeroNode.no); } } public void delete(HeroNode heroNode) { 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==heroNode.no) { flag = true; break; } temp = temp.next; } if(flag == true) { temp.next=heroNode.next; } else { System.out.printf("要刪除的no爲%d的節點不存在",heroNode.no); } } //顯示鏈表(遍歷) public void list() { //先判斷鏈表是否爲空 if(head.next==null) { return; } //由於頭節點不能動,所以須要一個輔助變量 HeroNode temp = head.next; while(true) { if(temp==null) { break; } System.out.println(temp.toString()); 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 + "]"; } }