數據結構和算法之單鏈表練習

數據結構和算法之單鏈表練習

三道大廠面試題:java

【新浪面試題】查找單鏈表中的倒數第k個結點
【騰訊面試題】單鏈表的反轉
【百度面試題】從尾到頭打印單鏈表node

一、先上神器:

lombok,在pom裏面加入依賴,並在idea中下載lombok插件,而後就能夠直接使用啦~面試

<dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.16</version>
        </dependency>

二、用一個heroNode類模擬節點

@Data
@NoArgsConstructor
class HeroNode{
    private int no;
    private String name;
    private String nickname; //暱稱
    private HeroNode next;//指向下一個節點編號

    public HeroNode(int no, String name, String nickname) {
        this.no = no;
        this.name = name;
        this.nickname = nickname;
    }
    public String toString(){
        return"HeroNode[no="+no+",name="+name+",nickname="+nickname+"]";
        //重寫tostring方法,方便展現輸出數據
    }
}

三、單鏈表方法的實現

//鏈表操做
class SingleLinkedTest{
    //鏈表的頭部固定,定義一個頭節點,數據爲空
    private HeroNode head = new HeroNode(0,"","");
    public HeroNode getHead() {
        return head;
    }

    //將節點掛上鏈表
    public void addNode(HeroNode heroNode){
        //先找到尾節點,而後把新節點掛到尾節點上
        //定義輔助節點temp
        HeroNode temp  = head;
        while (true){
            if (temp.getNext() == null){ //當輔助節點的下一個節點爲空時,表示找到了最後一個節點
                break;
            }
            temp = temp.getNext();
        }
        temp.setNext(heroNode);
    }

    //有序的將節點加入鏈表
    public void addOrderNode(HeroNode heroNode){
        //定義輔助節點temp
        HeroNode temp  = head;
        while (true){
            if (temp.getNext() == null){ //當輔助節點的下一個節點爲空時,表示已經到了最後一個節點
                temp.setNext(heroNode);
                break;
            }
            //當輔助節點的下一個節點的編號大於當前編號,則找到了插入的位置
            if (heroNode.getNo() < temp.getNext().getNo()){
                heroNode.setNext(temp.getNext());
                temp.setNext(heroNode);
                break;
            }
            temp = temp.getNext();

        }
    }

    //獲取節點個數,不包括頭結點
    public void getNodeCount(){
        HeroNode temp = head;
        int count = 0;
        while (true){
            if (temp.getNext() == null){
                break;
            }
            count++;
            temp = temp.getNext();
        }
        System.out.println("節點的個數爲:"+count);
    }

    //節點反轉
    public SingleLinkedTest reversalLink(SingleLinkedTest singleLinkedTest){
        SingleLinkedTest singleLinkedTestTemp = new SingleLinkedTest();
        HeroNode temp ;//輔助節點
        HeroNode temp01 = singleLinkedTest.getHead().getNext(); //要反轉鏈表的頭部
        while (true){
            if (temp01 == null){
                break; //舊鏈表空了,表示所有反轉完了
            }
            //反轉連接,因此全部新獲取的節點,每次都放到head後面
            temp = singleLinkedTestTemp.getHead().getNext(); //老是指向新鏈表的下一個節點
            singleLinkedTestTemp.getHead().setNext(temp01);
            temp01=temp01.getNext();
            singleLinkedTestTemp.getHead().getNext().setNext(temp);
        }
        return singleLinkedTestTemp;
    }

    //獲取倒數第K個節點
    public void getKNode(SingleLinkedTest singleLinkedTest,int k){
        int count = 0;
        HeroNode temp = singleLinkedTest.getHead(); //輔助節點
        if(temp.getNext() == null){
            System.out.println("鏈表爲空,沒法獲取");
            return;
        }
        while (true){
            if (count == k){
                System.out.printf("倒數第%d個節點是:\n"+temp,k);
                break;
            }
            temp = temp.getNext();
            count++;
        }
    }

    //展現鏈表全部數據
    public void showNode(SingleLinkedTest  singleLinkedTest){
        //定義輔助節點temp
        HeroNode temp = singleLinkedTest.getHead();
        if (temp.getNext() == null){
            System.out.println("當前鏈表爲空~");
            return;
        }
        while (true){
            if (temp.getNext() == null){
                break;
            }
            System.out.println(temp.getNext());
            temp = temp.getNext();
        }
    }
}

四、開始測試

public class SingleLinked {
    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, "四號", "小帥");
        HeroNode heroNode5 = new HeroNode(5, "五號", "小鹿");
        SingleLinkedTest singleLinkedTest = new SingleLinkedTest();
//        singleLinkedTest.addNode(heroNode1);//按照執行順序添加節點
//        singleLinkedTest.addNode(heroNode2);
//        singleLinkedTest.addNode(heroNode3);
        singleLinkedTest.addOrderNode(heroNode1);//有序的添加節點
        singleLinkedTest.addOrderNode(heroNode5);
        singleLinkedTest.addOrderNode(heroNode4);
        singleLinkedTest.addOrderNode(heroNode3);
        singleLinkedTest.addOrderNode(heroNode2);
        singleLinkedTest.showNode(singleLinkedTest);//鏈表數據展現

        //求鏈表節點個數
        singleLinkedTest.getNodeCount();

        //求倒數第K個節點  + 鏈表反轉 + 從尾到頭打印
        SingleLinkedTest singleLinkedTestReversal =
                singleLinkedTest.reversalLink(singleLinkedTest);//獲得反轉後的鏈表
        singleLinkedTest.showNode(singleLinkedTestReversal);//展現反轉後的鏈表數據
        singleLinkedTest.getKNode(singleLinkedTestReversal,5);//獲得反轉後的鏈表中第5條數據
    }
}

五、結果:

HeroNode[no=1,name=一號,nickname=小明]
HeroNode[no=2,name=二號,nickname=小紅]
HeroNode[no=3,name=三號,nickname=小君]
HeroNode[no=4,name=四號,nickname=小帥]
HeroNode[no=5,name=五號,nickname=小鹿]
節點的個數爲:5
HeroNode[no=5,name=五號,nickname=小鹿]
HeroNode[no=4,name=四號,nickname=小帥]
HeroNode[no=3,name=三號,nickname=小君]
HeroNode[no=2,name=二號,nickname=小紅]
HeroNode[no=1,name=一號,nickname=小明]
倒數第5個節點是:
HeroNode[no=1,name=一號,nickname=小明]算法

相關文章
相關標籤/搜索