Java單鏈表的增刪改查與面試題詳解
一、單鏈表的增刪改查
1、創(chuàng)建結(jié)點(diǎn)

單鏈表是由結(jié)點(diǎn)連接而成,所以我們首先要創(chuàng)建結(jié)點(diǎn)類,用于對結(jié)點(diǎn)進(jìn)行操作。定義data屬性 表示序號,定義name屬性表示結(jié)點(diǎn)存放的數(shù)據(jù)信息,定義next屬性表示指向下一個(gè)結(jié)點(diǎn)。構(gòu)造器只需要放入data屬性和name屬性,重寫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來進(jìn)行遍歷,因?yàn)閔ead頭結(jié)點(diǎn)不能動。
public class SingleLinkedList {
//首先創(chuàng)建頭結(jié)點(diǎn),此結(jié)點(diǎn)表示鏈表的頭,無具體數(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è)我們要刪除中間這個(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é)點(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),我們該怎么做?不難看出,倒數(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("沒有此結(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、騰訊面試題:單鏈表的反轉(zhuǎn)

首先創(chuàng)建輔助變量temp用于循環(huán)原來的鏈表,輔助變量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é)束,將新的順序替換原來的順序
head.next = headReversal.next;
//顯示鏈表,這個(gè)方法需要自己寫
showList(head);
}到此這篇關(guān)于Java單鏈表的增刪改查與面試題詳解的文章就介紹到這了,更多相關(guān)Java單鏈表增刪改查內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何實(shí)現(xiàn)java Iterator迭代器功能
這篇文章主要介紹了如何實(shí)現(xiàn)java Iterator迭代器功能,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01
Java鏈表的天然遞歸結(jié)構(gòu)性質(zhì)圖文與實(shí)例分析
這篇文章主要介紹了Java鏈表的天然遞歸結(jié)構(gòu)性質(zhì),結(jié)合圖文與實(shí)例形式分析了java鏈表中遞歸操作的原理、實(shí)現(xiàn)技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下2020-03-03
cmd中javac命令無法運(yùn)行(java指令能運(yùn)行)解決步驟
這篇文章主要介紹了在安裝JDK后,執(zhí)行javac命令沒有返回值的問題,可能是由于命令提示符窗口緩存問題、系統(tǒng)路徑優(yōu)先級問題、文件權(quán)限問題或命令行輸入問題,文中通過代碼將解決的步驟介紹的非常詳細(xì),需要的朋友可以參考下2025-02-02
Java基礎(chǔ)之static關(guān)鍵字的使用講解
這篇文章主要介紹了Java基礎(chǔ)之static關(guān)鍵字的使用講解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
Springboot解決no main manifest attribute錯誤
在開發(fā)Springboot項(xiàng)目時(shí),使用java -jar命令運(yùn)行jar包可能出現(xiàn)no main manifest attribute錯誤,本文就來介紹一下該錯誤的解決方法,感興趣的可以了解一下2024-09-09
Java項(xiàng)目開發(fā)中實(shí)現(xiàn)分頁的三種方式總結(jié)
這篇文章主要給大家介紹了關(guān)于Java項(xiàng)目開發(fā)中實(shí)現(xiàn)分頁的三種方式,通過這一篇文章可以很快的學(xué)會java分頁功能,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-02-02

