三道大廠面試題:java
【新浪面試題】查找單鏈表中的倒數第k個結點
【騰訊面試題】單鏈表的反轉
【百度面試題】從尾到頭打印單鏈表node
lombok,在pom裏面加入依賴,並在idea中下載lombok插件,而後就能夠直接使用啦~面試
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.16</version> </dependency>
@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=小明]算法