欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java?詳細分析四個經(jīng)典鏈表面試題

 更新時間:2022年03月23日 09:12:26   作者:K穩(wěn)重  
兄弟們,編程,當(dāng)我們學(xué)習(xí)完數(shù)據(jù)結(jié)構(gòu)的時候,你就會有一種豁然開朗的感覺。算是真正的入了編程的門,所以打好數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ)是特別特別重要的

前言:

上一章更到了鏈表,雖然知道了什么是鏈表,鏈表的結(jié)構(gòu)是怎么樣的,但這是遠遠不夠的,我們只清楚了點皮毛,如果讓你做題你還是會無從下手,所以我們必須多做題,在做題的過程中慢慢的我們就會覺得一切都很簡單。下面我們就來做幾道經(jīng)典的鏈表面試題?。。。。?!

第一題

題目:反轉(zhuǎn)一個單鏈表

每個節(jié)點是不變的,只是修改當(dāng)前每個節(jié)點的指向

看圖分析:

問題分析:

每個節(jié)點是不變的,只需要修改當(dāng)前每個節(jié)點的指向,第一個節(jié)點指向變成null,第二個節(jié)點的指向是第一個節(jié)點。

問題講解:

我們需要定義四個節(jié)點變量

head變量等于頭節(jié)點

cur = head

prev = null

curNext = cur.next

第一步:curNext = cur.next

第二步:cur.next = prev

第三步:prev = cur

第四步:cur = curNext

我們看一下圖解是如何走的

第一步:curNext = cur.next

第二步:cur.next = prev

第三步: prev = cur

第四步: cur = curNext

這四步讓它是一個循環(huán),我們再走一個循環(huán)給大家看

第五步: curNext = cur.next

第六步: cur.next = prev

第七步: prev = cur

第八步: cur = curNext

這樣兩個循環(huán)下來我想大家看的就很明白了,那既然是循環(huán)肯定會有終止條件,所以我們可以看一下,當(dāng)cur走到最后一個字節(jié)的時候,我們?nèi)匀恍枰?cur.next =  prev,再往后走的話cur就為null了,為null的時候就反轉(zhuǎn)結(jié)束了。所以我們循環(huán)的終止條件就是cur != null。另外我們還需要判斷一直指向頭節(jié)點的head為不為null,如果為null的話就是沒有這個鏈表,直接返回null就可以了。反轉(zhuǎn)完成后最后一個節(jié)點就變成了頭節(jié)點,所以我們返回prev就可以了、那我們就可以來寫代碼了。

代碼實現(xiàn):

lass Solution {
    public ListNode reverseList(ListNode head) {
         if (head == null) {
            return null;
        }
        ListNode cur = head;
        ListNode prev = null;
 
        while (cur != null) {
            ListNode cutNext = cur.next;
            cur.next = prev;
            prev = cur;
            cur = cutNext;
        }
        return prev;
 
    }
}

力扣

https://leetcode-cn.com/problems/reverse-linked-list/description/

題目鏈接在上面,大家一定打開鏈接自己做一下。

第二題

題目:給定一個帶有頭結(jié)點 head 的非空單鏈表,返回鏈表的中間結(jié)點。如果有兩個中間結(jié)點,則返回第二個中間結(jié)點。 

畫圖分析:

 問題分析:奇數(shù)的話返回中間的節(jié)點,偶數(shù)的話返回第二個中間節(jié)點,也就是說偶數(shù)返回第三個。

問題講解:

同樣的,我們來定義兩個引用變量

fast,slow兩個引用變量都等于head頭節(jié)點

如圖:

我們讓fast一次走兩步,slow一次走兩步,奇數(shù)情況:fast.next為null,slow所在的就是中間節(jié)點位置 。偶數(shù)情況:fast為null,low所在的就是中間節(jié)點位置 。原因是為什么呢?兩個同時走,fast的速度是slow的兩倍,那么路程也是兩倍,一個走到終點了,那么另一個就是走了路程的一半。有這樣的思路我們就可以來寫代碼了 ,同樣的先要判斷一下鏈表是不是為null,為null直接返回null就好了

代碼實現(xiàn):

class Solution {
    public ListNode middleNode(ListNode head) {
        if(head == null){
            return null;
        }
            ListNode fast = head;
            ListNode slow = head;
            while(fast != null && fast.next != null ){
                fast = fast.next.next;
                slow = slow.next;
            }
            return slow;
        }  
}

力扣

https://leetcode-cn.com/problems/middle-of-the-linked-list/description/

第三題

題目:輸入一個鏈表,輸出該鏈表中倒數(shù)第k個結(jié)點

畫圖分析:

問題講解:

同樣的,我們來定義兩個引用變量

fast,slow兩個引用變量都指向頭節(jié)點

如圖: 

如果我們要找倒數(shù)第K個,從第K個到倒數(shù)第1個需要走K-1步,所以我們先讓fast走K-1步,當(dāng)走完K-1步,fast指向的是倒數(shù)第一個時候,那么slow就是我們要找的倒數(shù)第K給,如果fast走完K-1步,fast指向的不是倒數(shù)第一個,那么這個時候我們讓fast和slow一起往后走,他們始終差了K-1步,當(dāng)fast 走到倒數(shù)第一個的時候,這個時候slow所指向的節(jié)點就是我們要找的倒數(shù)第K個。這里K我們也要判斷一下,如果K<=0 或者 k>鏈表的長度,我們直接返回null就可以了。

代碼實現(xiàn):

public class Solution {
    public ListNode FindKthToTail(ListNode head,int k) {
        if(k <= 0 || head == null){
            return null;
        }
        ListNode fast = head;
        ListNode slow = head;
        while(k-1 != 0){
            fast = fast.next;
            if(fast == null){
                return null;
            }
            k--;
        }
        while(fast.next != null){
            fast = fast.next;
            slow = slow.next;
        }
        return slow;
        
    }
}

題目鏈接

第四題

題目:將兩個有序鏈表合并為一個新的有序鏈表并返回。新鏈表是通過拼接給定的兩個鏈表的所有節(jié)點組成的。

畫圖分析:這是我們的兩個鏈表 

 問題講解:

同樣的,先定義兩個引用變量headA和headB分別指向兩個鏈表的頭節(jié)點。

定義一個虛擬節(jié)點,假設(shè)叫newHead,在定義一個引用變量tmp等于newHead

 首先我們先來比較headA和headB的大小,如果headA.val<headB.val,那么就讓tmp.next等于headA

 因為12小,那么就讓headA = headA.next,如果后面再找到比12大數(shù)字就要放在12的后頭,所以我們讓tmp = tmp.next,

這個時候再比較headA和headB, 如果headA.val>headB.val,那么就是讓tmp.next = headB,再讓headB = headB.next,tmp = tmp.next

 這樣就構(gòu)成了我們的一個循環(huán),當(dāng)headA和headB都不為null的時候我們才能繼續(xù)循環(huán),當(dāng)循環(huán)結(jié)束,要么headA為null,要么headB為null,當(dāng)headA為null,我們讓tmp.next = headB,當(dāng)headB為null,我們讓tmp.next = headA,

代碼實現(xiàn):

lass Solution {
    public ListNode mergeTwoLists(ListNode headA, ListNode headB) {
 ListNode newhead = new ListNode(-1);
       ListNode tmp = newhead;
       while (headA != null && headB != null) {
           if (headA.val < headB.val) {
               tmp.next = headA;
               headA = headA.next;
               tmp = tmp.next;
           } else {
               tmp.next = headB;
               headB = headB.next;
               tmp = tmp.next;
           }
       }
           if(headA == null){
               tmp.next = headB;
           }
           if(headB == null){
               tmp.next = headA;
           }
       return newhead.next;
 
    }
}

 力扣

https://leetcode-cn.com/problems/merge-two-sorted-lists/description/

因為時間原因:今天就先打卡這4道面試題,這4道面試題都是比較經(jīng)典的面試題,對我們鏈表這塊的學(xué)習(xí)會很有幫助。學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)就是要多刷題,這樣你才能完全掌握數(shù)據(jù)結(jié)構(gòu)這門知識。今天太晚了,明天再繼續(xù)給大家更面試題吧。有任何疑問大家都可以私信我,有問題歡迎大家指出來,我都會虛心學(xué)習(xí)的,希望可以和大家一起進步。

到此這篇關(guān)于Java 詳細分析力扣鏈表面試題的文章就介紹到這了,更多相關(guān)Java 鏈表內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring事件監(jiān)聽機制ApplicationEvent方式

    Spring事件監(jiān)聽機制ApplicationEvent方式

    這篇文章主要介紹了Spring事件監(jiān)聽機制ApplicationEvent方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 使用位運算、值交換等方式反轉(zhuǎn)java字符串的多種方法(四種方法)

    使用位運算、值交換等方式反轉(zhuǎn)java字符串的多種方法(四種方法)

    這篇文章主要介紹了使用位運算、值交換等方式反轉(zhuǎn)java字符串,本文通過四種方式給大家講解,給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • Mapstruct對象插入數(shù)據(jù)庫某個字段總是為空的bug詳解

    Mapstruct對象插入數(shù)據(jù)庫某個字段總是為空的bug詳解

    這篇文章主要為大家介紹了在一次需求開發(fā)Mapstruct中對象插入數(shù)據(jù)庫某個字段總是為空的bug問題詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • IDEA中scala生成變量后自動顯示變量類型問題

    IDEA中scala生成變量后自動顯示變量類型問題

    這篇文章主要介紹了IDEA中scala生成變量后自動顯示變量類型問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • 在Java下利用log4j記錄日志的方法

    在Java下利用log4j記錄日志的方法

    本文先對log4j進行了簡短的介紹,而后通過安裝、配置和普通項目和web項目幾個方面來詳細介紹了在Java下利用log4j記錄日志的方法,有需要的朋友們可以參考借鑒。
    2016-09-09
  • Java構(gòu)造代碼塊,靜態(tài)代碼塊原理與用法實例分析

    Java構(gòu)造代碼塊,靜態(tài)代碼塊原理與用法實例分析

    這篇文章主要介紹了Java構(gòu)造代碼塊,靜態(tài)代碼塊,結(jié)合實例形式分析了Java構(gòu)造代碼塊,靜態(tài)代碼塊的功能、原理、用法及操作注意事項,需要的朋友可以參考下
    2020-04-04
  • Java數(shù)據(jù)結(jié)構(gòu)--時間和空間復(fù)雜度

    Java數(shù)據(jù)結(jié)構(gòu)--時間和空間復(fù)雜度

    這篇文章主要介紹了java數(shù)據(jù)結(jié)構(gòu)的時間和空間復(fù)雜度,小編覺得這篇文寫的不錯,感興趣的朋友可以了解下,希望能夠給你帶來幫助
    2021-08-08
  • java 對象數(shù)組排序

    java 對象數(shù)組排序

    當(dāng)遇到數(shù)組排序時,我們經(jīng)常會使用學(xué)過的幾種排序方法,而java 本身提供了Arrays.sort,在數(shù)據(jù)元素較少或者對效率要求不是抬高時,直接使用Arrays.sort來的更容易。查看一下源碼后Arrays.sort 本身采用的是快速排序。
    2015-04-04
  • Spring相關(guān)知識點的總結(jié)與梳理

    Spring相關(guān)知識點的總結(jié)與梳理

    今天小編就為大家分享一篇關(guān)于Spring相關(guān)知識點的總結(jié)與梳理,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • Spring自動裝配@Autowired教程

    Spring自動裝配@Autowired教程

    @Autowired注解是Spring中非常重要且常見的,接下來就簡要的介紹一下它的用法。@Autowired默認是通過set方法,按照類型自動裝配JavaBean,set方法可省略不寫,它主要是修飾在成員變量上
    2023-01-01

最新評論