国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

算法通過村第二關(guān)-鏈表黃金筆記|K個(gè)一組反轉(zhuǎn)

這篇具有很好參考價(jià)值的文章主要介紹了算法通過村第二關(guān)-鏈表黃金筆記|K個(gè)一組反轉(zhuǎn)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。


前言

提示:沒有人天生就喜歡一種氣味而討厭另一種氣味。文明的暗示而已。


鏈表反轉(zhuǎn)|K個(gè)一組翻轉(zhuǎn)鏈表

給你鏈表的頭節(jié)點(diǎn) head ,每 k 個(gè)節(jié)點(diǎn)一組進(jìn)行翻轉(zhuǎn),請(qǐng)你返回修改后的鏈表。

k 是一個(gè)正整數(shù),它的值小于或等于鏈表的長(zhǎng)度。如果節(jié)點(diǎn)總數(shù)不是 k 的整數(shù)倍,那么請(qǐng)將最后剩余的節(jié)點(diǎn)保持原有順序。

你不能只是單純的改變節(jié)點(diǎn)內(nèi)部的值,而是需要實(shí)際進(jìn)行節(jié)點(diǎn)交換。

算法通過村第二關(guān)-鏈表黃金筆記|K個(gè)一組反轉(zhuǎn),算法集訓(xùn)營(yíng),算法,鏈表,筆記
進(jìn)階:你可以設(shè)計(jì)一個(gè)只用 O(1) 額外內(nèi)存空間的算法解決此問題嗎?

思路來的很快,重點(diǎn)是代碼層面的編寫,這個(gè)很重要,思路呢?就是常見的頭插法和穿針引線法來處理數(shù)組反轉(zhuǎn)問題,當(dāng)然今天我們也是采用這兩種方法解決的,那就開始實(shí)現(xiàn)他吧??

解題方法:

頭插法處理:

頭插法重點(diǎn)在理解虛擬節(jié)點(diǎn)上,如果這個(gè)問題解決了,相比較而言要比穿針引線要好實(shí)現(xiàn)的多??, 我們?cè)囍焰湵碚w分為3段,一段是已經(jīng)翻轉(zhuǎn)的,一端是正在反轉(zhuǎn),一端是未反轉(zhuǎn)的。為了方便翻轉(zhuǎn),我們需要京鏈表遍歷一邊,統(tǒng)計(jì)一下鏈表的長(zhǎng)度len,然后將鏈表進(jìn)行分組n=len/k,接下來就是循環(huán)進(jìn)行分組翻轉(zhuǎn)鏈表。 我們嘗試這畫一些圖,能夠更有里的說明:
算法通過村第二關(guān)-鏈表黃金筆記|K個(gè)一組反轉(zhuǎn),算法集訓(xùn)營(yíng),算法,鏈表,筆記
結(jié)假設(shè)我們開始翻轉(zhuǎn) 4 節(jié)點(diǎn):
算法通過村第二關(guān)-鏈表黃金筆記|K個(gè)一組反轉(zhuǎn),算法集訓(xùn)營(yíng),算法,鏈表,筆記
具體思路:

  1. 找到鏈表的長(zhǎng)度 len 分組
  2. cur.next = cur.next.next; next.next = pre.next; pre.next = next;
  3. 循環(huán)下一次

上代碼??

	/**
     * 方法2:頭插法
     *
     * @param head
     * @param k
     * @return
     */
    public static ListNode reverseKGroup2(ListNode head, int k) {
        ListNode dummyNode = new ListNode(-1);
        dummyNode.next = head;
        ListNode cur = head;
        int len = 0;
        while (cur != null) {
            cur = cur.next;
            len++;
        }
        int n = len / k; // 計(jì)算出來分幾組
        ListNode pre = dummyNode;
        cur = head;
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < k - 1; j++) {  // ? k - 1  畫圖就知道了
                ListNode next = cur.next;
                cur.next = cur.next.next;
                next.next = pre.next;
                pre.next = next;
            }
            pre = cur;  
            cur = cur.next;   // 記得修改指針
        }
       return dummyNode.next;
    }

穿針引線法處理:

這個(gè)思路可以回顧一下穿針引線,到底是怎么回事??

首先還是將鏈表分組翻轉(zhuǎn), 我們就可以一組一組的處理,把他們分成已經(jīng)翻轉(zhuǎn)的、正在翻轉(zhuǎn)的和未翻轉(zhuǎn)的三部分,同時(shí)為了方便處理頭節(jié)點(diǎn),我們使用了一個(gè)虛擬的節(jié)點(diǎn)。

接下來就是遍歷,根據(jù)k個(gè)為一組找到四個(gè)關(guān)鍵位置,并使用變量per,start,end,next標(biāo)記,比如下面的圖:
算法通過村第二關(guān)-鏈表黃金筆記|K個(gè)一組反轉(zhuǎn),算法集訓(xùn)營(yíng),算法,鏈表,筆記
接著我們就開始翻轉(zhuǎn),對(duì)應(yīng)顏色進(jìn)行翻轉(zhuǎn),我們將end.next = null ,直接使用鏈表翻轉(zhuǎn),復(fù)用鏈表翻轉(zhuǎn)的常規(guī)操作。??注意指針的變化,head便是傳入方法的參數(shù),我們接著看圖:
算法通過村第二關(guān)-鏈表黃金筆記|K個(gè)一組反轉(zhuǎn),算法集訓(xùn)營(yíng),算法,鏈表,筆記

當(dāng)然翻轉(zhuǎn)之后,我們接下來就是將原始鏈表縫起來,這就需要調(diào)整指針域,同樣這里也要注意指針的變化??
算法通過村第二關(guān)-鏈表黃金筆記|K個(gè)一組反轉(zhuǎn),算法集訓(xùn)營(yíng),算法,鏈表,筆記
接著調(diào)整指針進(jìn)行下一次循環(huán):
算法通過村第二關(guān)-鏈表黃金筆記|K個(gè)一組反轉(zhuǎn),算法集訓(xùn)營(yíng),算法,鏈表,筆記
總結(jié)一下??

  1. 遍歷找到四個(gè)關(guān)鍵位置,復(fù)用常規(guī)翻轉(zhuǎn)鏈表
  2. pre.next = end; start.next = next; 調(diào)整指針域
  3. 調(diào)整下一次循環(huán)

了解上面的圖,代碼應(yīng)該也會(huì)寫吧??

 /**
     * 方法1: 穿針引線法
     *
     * @param head
     * @param k
     * @return
     */
    public static ListNode reverseKGroup(ListNode head, int k) {
        ListNode dummyNode = new ListNode(-1);
        dummyNode.next = head;
        ListNode pre = dummyNode;
        ListNode end = dummyNode;
        while (end.next != null) { // 最終結(jié)束的地方
            for (int i = 0; i < k && end != null; i++) {
                end = end.next; // 找到當(dāng)前分組的最后一個(gè)
            }
            if (end == null) {
                break;
            }
            // 找到start next
            ListNode start = pre.next;
            ListNode next = end.next;
            end.next = null; // 思考?
            pre.next = reverse(start);
            start.next = next;
            pre = end;

            // 調(diào)整下一次循環(huán)
            end = pre;
        }
        return dummyNode.next;
    }

復(fù)習(xí)一下鏈表反轉(zhuǎn)??:


 private static ListNode reverse(ListNode head) {
       ListNode pre = null;
       ListNode cur = head;
       while(cur != null) {
           ListNode next = cur.next;
           cur.next = pre;
           pre = cur;
           cur = next;
       }
       return pre;
    }

總結(jié)

注意:指針域的變化,多畫圖更容易理解,鏈表反轉(zhuǎn)重點(diǎn),重點(diǎn),重點(diǎn)?。?!文章來源地址http://www.zghlxwxcb.cn/news/detail-634014.html

到了這里,關(guān)于算法通過村第二關(guān)-鏈表黃金筆記|K個(gè)一組反轉(zhuǎn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 算法通關(guān)村第二關(guān)——鏈表反轉(zhuǎn)

    算法通關(guān)村第二關(guān)——鏈表反轉(zhuǎn)

    鏈表反轉(zhuǎn),就是鏈表原來是1-2-3-4-5,經(jīng)過反轉(zhuǎn)處理過后變成5-4-3-2-1 處理鏈表反轉(zhuǎn),有兩種方式,一個(gè)是建立虛擬頭結(jié)點(diǎn),一個(gè)是直接操作鏈表反轉(zhuǎn)。 ?這是執(zhí)行的流程 最核心的兩行就是 直接想我要讓她反轉(zhuǎn),我現(xiàn)在設(shè)立了虛擬頭結(jié)點(diǎn),那我就要讓新加進(jìn)這個(gè)反轉(zhuǎn)鏈表的結(jié)點(diǎn)

    2024年02月13日
    瀏覽(23)
  • 算法通關(guān)村第二關(guān)——終于學(xué)會(huì)鏈表

    算法通關(guān)村第二關(guān)——終于學(xué)會(huì)鏈表

    LeetCode206 給我們單鏈表的頭結(jié)點(diǎn)head,請(qǐng)你反轉(zhuǎn)鏈表,并返回反轉(zhuǎn)后的鏈表,如圖所示: 本題有兩種方法,分別為 建立虛擬頭結(jié)點(diǎn)輔助反轉(zhuǎn) 以及 直接操作鏈表實(shí)現(xiàn)反轉(zhuǎn) ,兩種方法我將逐一分析講解。 首先從名字分析一下這種方法,虛擬頭結(jié)點(diǎn),顧名思義,我們可以建立一個(gè)

    2024年02月15日
    瀏覽(27)
  • 算法通關(guān)村第二關(guān),終于學(xué)會(huì)反轉(zhuǎn)鏈表!

    文章目錄 一、反轉(zhuǎn)鏈表 總結(jié) 提示:以下是本篇文章正文內(nèi)容,下面案例可供參考 反轉(zhuǎn)鏈表主要是用三個(gè)指針,一個(gè)指針指向空,一個(gè)指向head第一個(gè)節(jié)點(diǎn),一個(gè)在循環(huán)做的臨時(shí)變量,在循環(huán)設(shè)置這個(gè)指針不用考慮head為空的情況,然后在循環(huán)改變指向后,向前移動(dòng)一步,然后

    2024年02月14日
    瀏覽(22)
  • 算法通關(guān)村第二關(guān)——終于學(xué)會(huì)鏈表反轉(zhuǎn)了

    算法通關(guān)村第二關(guān)——終于學(xué)會(huì)鏈表反轉(zhuǎn)了

    ?方法一:建立虛擬頭結(jié)點(diǎn)輔助反轉(zhuǎn) 創(chuàng)建一個(gè)虛擬頭節(jié)點(diǎn),獲取鏈表中每個(gè)節(jié)點(diǎn),用虛擬頭節(jié)點(diǎn)指向這個(gè)節(jié)點(diǎn),并在鏈表中刪除, 方法二:直接操作鏈表實(shí)現(xiàn)反轉(zhuǎn) 記錄當(dāng)前節(jié)點(diǎn)(cur),前驅(qū)節(jié)點(diǎn)(pre),后繼節(jié)點(diǎn)(next),先將當(dāng)前節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)指向前驅(qū)節(jié)點(diǎn),然后將當(dāng)前節(jié)點(diǎn)賦給前

    2024年02月14日
    瀏覽(28)
  • 算法通關(guān)村第二關(guān)——兩兩交換鏈表中的節(jié)點(diǎn)問題解析
  • [Go版]算法通關(guān)村第二關(guān)——終于學(xué)會(huì)鏈表反轉(zhuǎn)了

    [Go版]算法通關(guān)村第二關(guān)——終于學(xué)會(huì)鏈表反轉(zhuǎn)了

    題目鏈接:LeetCode-206. 反轉(zhuǎn)鏈表 源碼地址:GitHub-golang版本 說明:遍歷該鏈表,依次取出當(dāng)前節(jié)點(diǎn)插入到新鏈表的首位(虛擬頭結(jié)點(diǎn)緊后)即可, 注意要提前保存當(dāng)前節(jié)點(diǎn)的Next數(shù)據(jù) ,否則插入到新鏈表后就沒法繼續(xù)向下遍歷了。 說明:原理和方法1一致,只不過現(xiàn)在沒有虛擬

    2024年02月14日
    瀏覽(25)
  • [Go版]算法通關(guān)村第二關(guān)青銅——終于學(xué)會(huì)鏈表反轉(zhuǎn)了

    [Go版]算法通關(guān)村第二關(guān)青銅——終于學(xué)會(huì)鏈表反轉(zhuǎn)了

    題目鏈接:LeetCode-206. 反轉(zhuǎn)鏈表 源碼地址:GitHub-golang版本 說明:遍歷該鏈表,依次取出當(dāng)前節(jié)點(diǎn)插入到新鏈表的首位(虛擬頭結(jié)點(diǎn)緊后)即可, 注意要提前保存當(dāng)前節(jié)點(diǎn)的Next數(shù)據(jù) ,否則插入到新鏈表后就沒法繼續(xù)向下遍歷了。 說明:原理和方法1一致,只不過現(xiàn)在沒有虛擬

    2024年02月13日
    瀏覽(19)
  • 不簡(jiǎn)單的字符串轉(zhuǎn)換問題(算法村第十二關(guān)青銅挑戰(zhàn))

    709. 轉(zhuǎn)換成小寫字母 - 力扣(LeetCode) 給你一個(gè)字符串 s ,將該字符串中的大寫字母轉(zhuǎn)換成相同的小寫字母,返回新的字符串。 1 = s.length = 100 解 大寫字母和小寫字母的值之間存在固定的差異。例如,小寫字母 a 的ASCII值為 97 ,而對(duì)應(yīng)的大寫字母 A 的ASCII值為 65 ,兩者之差恰

    2024年01月25日
    瀏覽(28)
  • 算法通過村第十八關(guān)-回溯|青銅筆記|什么叫回溯(中篇)

    算法通過村第十八關(guān)-回溯|青銅筆記|什么叫回溯(中篇)

    提示:陽光好的時(shí)候,會(huì)感覺還可以活很久,甚至可以活出喜悅。 --余秀華 回溯是非常重要的算法思想之一,主要解決一些暴力枚舉也搞不定的問題(這里埋個(gè)坑??)例如組合、分割、子集、棋盤等等。從性能角度來看回溯算法的效率并不是很高,但是對(duì)于暴力也解決不了

    2024年02月06日
    瀏覽(25)
  • [Go版]算法通關(guān)村第十二關(guān)黃金——字符串沖刺題

    [Go版]算法通關(guān)村第十二關(guān)黃金——字符串沖刺題

    題目鏈接:LeetCode-14. 最長(zhǎng)公共前綴 以第一個(gè)子字符串為標(biāo)準(zhǔn),遍歷其每個(gè)字符時(shí),內(nèi)嵌遍歷其余子字符串的對(duì)應(yīng)字符是否一致。不一致時(shí),則返回當(dāng)前字符之前的子字符串。 復(fù)雜度:時(shí)間復(fù)雜度 O ( n ? m ) O(n*m) O ( n ? m ) 、空間復(fù)雜度 O ( 1 ) O(1) O ( 1 ) 時(shí)間復(fù)雜度:其中 n

    2024年02月12日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包