25. k個(gè)一組翻轉(zhuǎn)鏈表

題目
給出一個(gè)鏈表炮障,每 k 個(gè)節(jié)點(diǎn)一組進(jìn)行翻轉(zhuǎn)目派,并返回翻轉(zhuǎn)后的鏈表。

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

示例 :

給定這個(gè)鏈表:1->2->3->4->5

當(dāng) k = 2 時(shí)谅摄,應(yīng)當(dāng)返回: 2->1->4->3->5

當(dāng) k = 3 時(shí),應(yīng)當(dāng)返回: 3->2->1->4->5

說明 :

你的算法只能使用常數(shù)的額外空間系馆。
你不能只是單純的改變節(jié)點(diǎn)內(nèi)部的值送漠,而是需要實(shí)際的進(jìn)行節(jié)點(diǎn)交換。

思路
題目的難度在于翻轉(zhuǎn)的長(zhǎng)度不再是整個(gè)鏈表的長(zhǎng)度了由蘑。在確定反轉(zhuǎn)長(zhǎng)度的情況下仍然可以利用鏈表的reverse闽寡,用1-2-3-4-5為例,首先反轉(zhuǎn)兩個(gè)變成2-1-3-4-5尼酿,下一次應(yīng)該反轉(zhuǎn)3和4爷狈,利用reverse仍然可以實(shí)現(xiàn),但要注意的是裳擎,反轉(zhuǎn)后的順序4-3涎永,其中的4必須與前面1聯(lián)系,而3必須與后面的3聯(lián)系,否則整個(gè)鏈表就斷了土辩。另外支救,最后只剩下一個(gè)5時(shí)抢野,其長(zhǎng)度已經(jīng)小于要求的長(zhǎng)度2了拷淘,這時(shí)候應(yīng)該返回NULL,代表與前面的關(guān)系不改變指孤。
首先給出改進(jìn)的reverse函數(shù)启涯,其中head表示當(dāng)前要反轉(zhuǎn)的鏈表段的起始位置,n-1表示還剩有多少個(gè)數(shù)沒有完成反轉(zhuǎn)恃轩,tail表示這段要反轉(zhuǎn)鏈表反轉(zhuǎn)后的尾部(其實(shí)就是反轉(zhuǎn)前此段鏈表的頭部)结洼,begin表示此段鏈表的前一個(gè)結(jié)點(diǎn),在完成反轉(zhuǎn)后必須與前一個(gè)結(jié)點(diǎn)保持聯(lián)系叉跛。

    ListNode* reverse (ListNode* head, int n, ListNode* tail , ListNode* begin)
    {
        if (head && !head->next && n > 1) return NULL;
        if (n == 1)
        {
            if (head && tail)
            {
                tail->next = head->next;
            }
            if (begin)
            {
                begin->next = head;
            }
        }
        else if (head && head->next && n > 1)
        {
            ListNode* temp = reverse(head->next, n - 1, tail, begin);
            if (temp)
            {
                temp->next = head;
            }
            if (!temp)
            {
                return NULL;
            }
        }
        return head;
    }

下面給出調(diào)用reverse的代碼松忍,首先應(yīng)該獲得第一段反轉(zhuǎn),如果反轉(zhuǎn)的結(jié)果是NULL筷厘,說明整個(gè)鏈表的長(zhǎng)度都不夠鸣峭,則直接返回原鏈表即可。否則的話酥艳,就找到新鏈表開始的位置摊溶,保存下來,作為最后返回時(shí)用充石。完成第一段反轉(zhuǎn)后莫换,下一段反轉(zhuǎn)的起始應(yīng)為第一段的末尾的下一個(gè)結(jié)點(diǎn),然后繼續(xù)reverse就ok了骤铃。

    ListNode* reverseKGroup2(ListNode* head, int k)
    {
        ListNode* result = head;
        int t = k;
        while (t > 1 && result)
        {
            result = result->next;
            t--;
        }
        ListNode* temp = reverse(head, k, head, NULL);
        if (!temp) return head;
        while (temp && temp->next)
        {
            temp = reverse(temp->next, k, temp->next, temp);
        }
        return result;
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末拉岁,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子惰爬,更是在濱河造成了極大的恐慌喊暖,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件补鼻,死亡現(xiàn)場(chǎng)離奇詭異哄啄,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)风范,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門咨跌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人硼婿,你說我怎么就攤上這事锌半。” “怎么了寇漫?”我有些...
    開封第一講書人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵刊殉,是天一觀的道長(zhǎng)殉摔。 經(jīng)常有香客問我,道長(zhǎng)记焊,這世上最難降的妖魔是什么逸月? 我笑而不...
    開封第一講書人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮遍膜,結(jié)果婚禮上碗硬,老公的妹妹穿的比我還像新娘。我一直安慰自己瓢颅,他們只是感情好恩尾,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著挽懦,像睡著了一般翰意。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上信柿,一...
    開封第一講書人閱讀 51,578評(píng)論 1 305
  • 那天冀偶,我揣著相機(jī)與錄音,去河邊找鬼角塑。 笑死蔫磨,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的圃伶。 我是一名探鬼主播堤如,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼窒朋!你這毒婦竟也來了搀罢?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤侥猩,失蹤者是張志新(化名)和其女友劉穎榔至,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體欺劳,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡唧取,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了划提。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片枫弟。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖鹏往,靈堂內(nèi)的尸體忽然破棺而出淡诗,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布韩容,位于F島的核電站款违,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏群凶。R本人自食惡果不足惜插爹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望座掘。 院中可真熱鬧递惋,春花似錦、人聲如沸溢陪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽形真。三九已至,卻和暖如春超全,著一層夾襖步出監(jiān)牢的瞬間咆霜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工嘶朱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蛾坯,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓疏遏,卻偏偏與公主長(zhǎng)得像脉课,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子财异,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 25.k個(gè)一組翻轉(zhuǎn)鏈表 給出一個(gè)鏈表倘零,每k個(gè)節(jié)點(diǎn)一組進(jìn)行翻轉(zhuǎn),并返回翻轉(zhuǎn)后的鏈表戳寸。 k是一個(gè)正整數(shù)呈驶,它的值小于或等...
    不愛去冒險(xiǎn)的少年y閱讀 750評(píng)論 0 0
  • 題目描述 給出一個(gè)鏈表,每 k 個(gè)節(jié)點(diǎn)一組進(jìn)行翻轉(zhuǎn)疫鹊,并返回翻轉(zhuǎn)后的鏈表袖瞻。 k 是一個(gè)正整數(shù),它的值小于或等于鏈表的...
    TomorrowWu閱讀 611評(píng)論 0 0
  • 給出一個(gè)鏈表拆吆,每 k 個(gè)節(jié)點(diǎn)一組進(jìn)行翻轉(zhuǎn)聋迎,并返回翻轉(zhuǎn)后的鏈表。 k 是一個(gè)正整數(shù)锈拨,它的值小于或等于鏈表的長(zhǎng)度砌庄。如果...
    vbuer閱讀 658評(píng)論 0 0
  • 木心先生說,沒有審美力是絕癥,知識(shí)也救不了÷ィ現(xiàn)在很多人窮佩微,往往窮的不是物質(zhì),而是精神萌焰。沒有精氣神哺眯,沒有恰當(dāng)?shù)膶徝溃?..
    嗶嗶卟閱讀 339評(píng)論 0 1
  • 我未到三十的時(shí)候,遇到了很多優(yōu)秀的人士扒俯。他們對(duì)我的影響無法估量奶卓,今后必成為我的行事指南。一生要學(xué)的太多撼玄,我一直在路...
    林鳳君閱讀 110評(píng)論 0 0