Java單鏈表的增刪改查與面試題詳解
一、單鏈表的增刪改查
1、創(chuàng)建結(jié)點(diǎn)
單鏈表是由結(jié)點(diǎn)連接而成,所以我們首先要?jiǎng)?chuàng)建結(jié)點(diǎn)類,用于對(duì)結(jié)點(diǎn)進(jìn)行操作。定義data屬性 表示序號(hào),定義name屬性表示結(jié)點(diǎn)存放的數(shù)據(jù)信息,定義next屬性表示指向下一個(gè)結(jié)點(diǎn)。構(gòu)造器只需要放入data屬性和name屬性,重寫(xiě)toString方法方便打印結(jié)點(diǎn)信息。
public class Node { public int data; public String name; public Node next; public Node(int data, String name){ this.data = data; this.name = name; } @Override public String toString() { return "Node{" + "data=" + data + ", name='" + name + '\'' + '}'; } }
2、單鏈表的添加操作
首先創(chuàng)建頭結(jié)點(diǎn)
此結(jié)點(diǎn)表示鏈表的頭,不存放實(shí)際數(shù)據(jù)的。
private Node head = new Node(0,"");
添加操作
將新的結(jié)點(diǎn)添加到鏈表的尾部,我們首先要遍歷鏈表,找到鏈表的尾部,然后將最后一個(gè)結(jié)點(diǎn)的next指向新的結(jié)點(diǎn),新結(jié)點(diǎn)的next指向NULL,這樣就完成了鏈表的添加操作,這種每次添加到鏈表的尾部的操作稱為尾插法。注意,當(dāng)我們遍歷鏈表時(shí),需要一個(gè)輔助結(jié)點(diǎn)temp來(lái)進(jìn)行遍歷,因?yàn)閔ead頭結(jié)點(diǎn)不能動(dòng)。
public class SingleLinkedList { //首先創(chuàng)建頭結(jié)點(diǎn),此結(jié)點(diǎn)表示鏈表的頭,無(wú)具體數(shù)據(jù) private Node head = new Node(0,""); //添加結(jié)點(diǎn)操作 public void addData(Node node){ Node temp = head; while (true){ if (temp.next == null){ temp.next = node; node.next = null; break; } temp = temp.next; } } }
3、單鏈表的刪除操作
假設(shè)我們要?jiǎng)h除中間這個(gè)結(jié)點(diǎn),我們只需要將這個(gè)結(jié)點(diǎn)的上一個(gè)結(jié)點(diǎn)的next指向這個(gè)結(jié)點(diǎn)的下一個(gè)結(jié)點(diǎn)(也就是將第一個(gè)結(jié)點(diǎn)的next指向第三個(gè)結(jié)點(diǎn))。
public void delData(Node node){ Node temp = head; while (true){ //如果是要?jiǎng)h除的結(jié)點(diǎn) if (temp.next.data == node.data){ temp.next = temp.next.next; break; }else if(temp.next == null){ System.out.println("未找到結(jié)點(diǎn)!"); break; } temp = temp.next; } }
4、單鏈表的有效結(jié)點(diǎn)的個(gè)數(shù)
我們可以定義一個(gè)計(jì)數(shù)的變量count,初始化為0,然后循環(huán)遍歷鏈表,每遍歷到一個(gè)結(jié)點(diǎn),count就加一,這樣就能求出單鏈表的有效個(gè)數(shù)。
public int countData(){ Node temp = head.next; int count = 0; while (true){ if (temp == null){ break; } count++; temp = temp.next; } return count; }
二、大廠面試題
1、新浪微博:查找單鏈表中倒數(shù)第k個(gè)結(jié)點(diǎn)
從上圖可以看出,假設(shè)要找倒數(shù)第2個(gè)結(jié)點(diǎn),我們?cè)撛趺醋??不難看出,倒數(shù)第二個(gè)結(jié)點(diǎn)也是順序的第三個(gè)結(jié)點(diǎn),也就是將倒數(shù)的結(jié)點(diǎn)轉(zhuǎn)換成順序結(jié)點(diǎn),遍歷鏈表找到順序結(jié)點(diǎn)即可。因?yàn)槭怯忻鞔_表示是第幾個(gè)結(jié)點(diǎn),所以我們需要知道結(jié)點(diǎn)的有效個(gè)數(shù),前面我們介紹了有效個(gè)數(shù)的求法,直接用即可。當(dāng)我們要找倒數(shù)第k個(gè)結(jié)點(diǎn),我們可以轉(zhuǎn)換成順序的第(count - k + 1)個(gè)結(jié)點(diǎn)。比如:k = 2,count = 4, 倒數(shù)第2個(gè)結(jié)點(diǎn)也就是順序第(4 - 2 + 1 = 3)個(gè)結(jié)點(diǎn)。
public Node referNode(int n){ //根據(jù)前面計(jì)算有效個(gè)數(shù)的方法,求得鏈表總結(jié)點(diǎn)個(gè)數(shù) int max = countData(); //計(jì)數(shù) int count = 1; //判斷指定的結(jié)點(diǎn)是否在范圍內(nèi) if (!(n >= 1 && n <= max)){ throw new RuntimeException("沒(méi)有此結(jié)點(diǎn)!"); } //輔助結(jié)點(diǎn) Node temp = head.next; //循環(huán)遍歷查找 while (true){ //滿足條件,則是我們要找的結(jié)點(diǎn) if (count == (max - n + 1)){ return temp; }else { temp = temp.next; count++; } } }
2、騰訊面試題:?jiǎn)捂湵淼姆崔D(zhuǎn)
首先創(chuàng)建輔助變量temp用于循環(huán)原來(lái)的鏈表,輔助變量temp1記錄temp的下一個(gè)位置,每遍歷到一個(gè)結(jié)點(diǎn)就插入到新鏈表的頭部,這種方式稱為頭插法。
public void nodeReversal(Node head){ //如果鏈表為空或鏈表只有一個(gè)結(jié)點(diǎn),則不需要反轉(zhuǎn) if (head.next == null || head.next.next == null){ return; } //輔助變量temp Node temp = head.next; //輔助變量temp1 Node temp1 = null; //循環(huán)遍歷 while (true){ //退出循環(huán)的條件 if (temp == null){ break; } //首先將temp的下一個(gè)結(jié)點(diǎn)給temp1 temp1 = temp.next; //然后將temp的next指向新鏈表頭headReversal的next(頭指向的下一個(gè)) temp.next = headReversal.next; //再然后將新鏈表頭headReversal的next指向temp結(jié)點(diǎn) headReversal.next = temp; //最后將temp1記錄的結(jié)點(diǎn)賦值給temp temp = temp1; } //遍歷結(jié)束,將新的順序替換原來(lái)的順序 head.next = headReversal.next; //顯示鏈表,這個(gè)方法需要自己寫(xiě) showList(head); }
到此這篇關(guān)于Java單鏈表的增刪改查與面試題詳解的文章就介紹到這了,更多相關(guān)Java單鏈表增刪改查內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java調(diào)用SQL腳本執(zhí)行常用的方法示例
這篇文章主要給大家介紹了關(guān)于Java調(diào)用SQL腳本執(zhí)行常用的方法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-04-04Java的ConcurrentHashMap中不能存儲(chǔ)null的原因解析
眾所周知,在Java中Map可以存儲(chǔ)null,而ConcurrentHashMap不能存儲(chǔ)null值,那么為什么呢?今天通過(guò)源碼分析給大家詳細(xì)解讀,感興趣的朋友一起看看吧2022-07-07Mybatis動(dòng)態(tài)sql中@Param使用詳解
這篇文章主要介紹了Mybatis動(dòng)態(tài)sql中@Param使用詳解,當(dāng)方法的參數(shù)為非自定義pojo類型,且使用了動(dòng)態(tài)sql,那么就需要在參數(shù)前加上@Param注解,需要的朋友可以參考下2023-10-10整理java讀書(shū)筆記十五之java中的內(nèi)部類
內(nèi)部類是指在一個(gè)外部類的內(nèi)部再定義一個(gè)類。類名不需要和文件夾相同。本文給大家分享java讀書(shū)筆記十五之java中的內(nèi)部類,對(duì)java讀書(shū)筆記相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧2015-12-12Spring?Boot?Nacos?實(shí)現(xiàn)不停服發(fā)布過(guò)程詳解
這篇文章主要為大家介紹了Spring?Boot?Nacos實(shí)現(xiàn)不停服發(fā)布過(guò)程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05利用Spring IOC技術(shù)實(shí)現(xiàn)用戶登錄驗(yàn)證機(jī)制
這篇文章主要為大家詳細(xì)介紹了Spring IOC技術(shù)實(shí)現(xiàn)用戶登錄驗(yàn)證機(jī)制的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10