日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

链表K个节点的组内逆序调整问题

發(fā)布時間:2023/11/27 windows 49 coder
生活随笔 收集整理的這篇文章主要介紹了 链表K个节点的组内逆序调整问题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

鏈表K個節(jié)點的組內(nèi)逆序調(diào)整問題

作者:Grey

原文地址:

博客園:鏈表K個節(jié)點的組內(nèi)逆序調(diào)整問題

CSDN:鏈表K個節(jié)點的組內(nèi)逆序調(diào)整問題

題目描述

LeetCode 25. Reverse Nodes in k-Group

本題的 follow up 是:

Follow-up: Can you solve the problem in O(1) extra memory space?

即用\(O(1)\)的空間復(fù)雜度實現(xiàn)整個算法。

主要思路

本題需要設(shè)計兩個方法:

第一個方法

ListNode getKGroupEnd(ListNode start, int k)

該方法表示:從鏈表start位置開始,數(shù)夠k個位置,返回k個位置后的那個節(jié)點。

比如鏈表為:

...-> start -> b -> c -> d -> e

假設(shè):k = 3,

則:表示從start開始,數(shù)夠 3 個,所以返回c節(jié)點

如果是下述情況

...-> start -> b -> c -> null

假設(shè):k = 6,

由于start后面不夠 6 個節(jié)點,所以返回null,完整代碼如下:

public static ListNode getKGroupEnd(ListNode start, int k) {
    while (--k != 0 && start != null) {
        start = start.next;
    }
    return start;
}

第二個方法void reverse(ListNode start, ListNode end),表示反轉(zhuǎn)startend之間的鏈表。

例如:原鏈表為:

....->a->b->c->d->e....

假設(shè):start = a, end = d

經(jīng)過reverse方法,會變成

...d->c->b->a->e.....

reverse方法也相對比較簡單,就是鏈表反轉(zhuǎn)的一種特殊情況,實現(xiàn)代碼如下:

public static void reverse(ListNode start, ListNode end) {
    end = end.next;
    ListNode pre = null;
    ListNode cur = start;
    while (cur != end) {
        ListNode tmp = cur.next;
        cur.next = pre;
        pre = cur;
        cur = tmp;
    }
    start.next = end;
}

有了上述兩個方法,我們可以比較方便實現(xiàn)原題要求,主流程如下

public static ListNode reverseKGroup(ListNode head, int k) {
    ListNode start = head;
    ListNode end = getKGroupEnd(start, k);
    if (end == null) {
        return head;
    }
    // 第一組湊齊了!
    head = end;
    reverse(start, end);
    // 上一組的結(jié)尾節(jié)點
    ListNode lastEnd = start;
    while (lastEnd.next != null) {
        start = lastEnd.next;
        end = getKGroupEnd(start, k);
        if (end == null) {
            return head;
        }
        reverse(start, end);
        lastEnd.next = end;
        lastEnd = start;
    }
    return head;
}

整個過程時間復(fù)雜度\(O(N)\),空間復(fù)雜度\(O(1)\)。

更多

算法和數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)筆記

算法和數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)代碼

參考資料

算法和數(shù)據(jù)結(jié)構(gòu)體系班-左程云

總結(jié)

以上是生活随笔為你收集整理的链表K个节点的组内逆序调整问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。