資料結構--單連結串列的建立和遍歷(程式碼優化)

Hello_World&Java發表於2021-01-05

程式碼優化(基於上一篇部落格“資料結構–單連結串列的建立和遍歷”)
本次優化主要體現在add方法和list方法上

import java.util.Scanner;

//單向連結串列優化
public class CircleLinkedListDemo2 {
    public static void main(String[] args) {
        SingleLinkedList2 singleLinkedList = new SingleLinkedList2();
        boolean tar = true;
        while(tar){
            System.out.println("請選擇你要執行的操作,add:往連結串列中新增資料  show:遍歷整個連結串列 quit:退出程式");
            Scanner sc = new Scanner(System.in);
            String str = sc.next();
            switch(str){
                case "add" :
                    System.out.println("請輸入新節點的序號:");
                    int no = sc.nextInt();
                    System.out.println("請輸入新節點的名字:");
                    String name = sc.next();
                    System.out.println("請輸入新節點的暱稱:");
                    String nickName = sc.next();
                    HeroNode2 newNode = new HeroNode2(no, name, nickName);
                    singleLinkedList.add2(newNode);
                    break;

                case "show" :
                    singleLinkedList.list2(singleLinkedList.head.next);
                    break;

                case "quit" :
                    tar = false;
                    break;
            }
        }
    }
}


//定義SingleLinkedList,管理我們的英雄
class SingleLinkedList2{

    //先初始化一個頭節點,頭節點不要動,不存放具體的資料
    public HeroNode2 head = new HeroNode2(0,"","");

    // 因為head節點不能動,因此我們需要一個輔助遍歷temp
    public HeroNode2 temp = head;

    public int count = 0;

    //優化add方法:不用每次都從連結串列頭節點開始遍歷找到連結串列的最後節點
    //每次往連結串列最後加完節點後,temp則指向連結串列的最後節點
    public void add2(HeroNode2 heroNode){
        count++;
        if(count == 1){
            head.next = heroNode;
        }
        temp.next = heroNode;
        temp = heroNode;
    }



    //優化list方法,採用 遞迴 來遍歷連結串列
    public void list2(HeroNode2 headNext){
        if(head.next == null){
            throw new RuntimeException("連結串列為空,沒有資料,請先新增資料再列印");
        }
        System.out.println("序號:"+headNext.no);
        System.out.println("姓名:"+headNext.name);
        System.out.println("暱稱:"+headNext.nickName);
        System.out.println("-----------------------------------");

        if(headNext.next != null){
            list2(headNext.next);  //遞迴
        }
    }
}



//定義HeroNode,每個HeroNode 物件就是個一個節點
class HeroNode2{

    public int no;

    public String name;

    public String nickName;

    public HeroNode2 next;  //指向下一個節點

    //構造器
    public HeroNode2(int no, String name, String nickName){
        this.no = no;
        this.name = name;
        this.nickName = nickName;
    }
}

結果截圖:
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

相關文章