中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++實現旋轉鏈表

發布時間:2021-07-19 01:34:20 來源:億速云 閱讀:221 作者:chen 欄目:開發技術

這篇文章主要介紹“C++實現旋轉鏈表”,在日常操作中,相信很多人在C++實現旋轉鏈表問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C++實現旋轉鏈表”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

[LeetCode] 61. Rotate List 旋轉鏈表

Given the head of a linked list, rotate the list to the right by k places.

Example 1:

C++實現旋轉鏈表

Input: head = [1,2,3,4,5], k = 2
Output: [4,5,1,2,3]

Example 2:

C++實現旋轉鏈表

Input: head = [0,1,2], k = 4
Output: [2,0,1]

Constraints:

  • The number of nodes in the list is in the range [0, 500].

  • -100 <= Node.val <= 100

  • 0 <= k <= 2 * 109

這道旋轉鏈表的題和之前那道 Rotate Array 很類似,但是比那道要難一些,因為鏈表的值不能通過下表來訪問,只能一個一個的走,博主剛開始拿到這題首先想到的就是用快慢指針來解,快指針先走k步,然后兩個指針一起走,當快指針走到末尾時,慢指針的下一個位置是新的順序的頭結點,這樣就可以旋轉鏈表了,自信滿滿的寫完程序,放到 OJ 上跑,以為能一次通過,結果跪在了各種特殊情況,首先一個就是當原鏈表為空時,直接返回NULL,還有就是當k大于鏈表長度和k遠遠大于鏈表長度時該如何處理,需要首先遍歷一遍原鏈表得到鏈表長度n,然后k對n取余,這樣k肯定小于n,就可以用上面的算法了,代碼如下:

 解法一:

class Solution {
public:
    ListNode *rotateRight(ListNode *head, int k) {
        if (!head) return NULL;
        int n = 0;
        ListNode *cur = head;
        while (cur) {
            ++n;
            cur = cur->next;
        }
        k %= n;
        ListNode *fast = head, *slow = head;
        for (int i = 0; i < k; ++i) {
            if (fast) fast = fast->next;
        }
        if (!fast) return head;
        while (fast->next) {
            fast = fast->next;
            slow = slow->next;
        }
        fast->next = head;
        fast = slow->next;
        slow->next = NULL;
        return fast;
    }
};

這道題還有一種解法,跟上面的方法類似,但是不用快慢指針,一個指針就夠了,原理是先遍歷整個鏈表獲得鏈表長度n,然后此時把鏈表頭和尾鏈接起來,在往后走 n - k%n 個節點就到達新鏈表的頭結點前一個點,這時斷開鏈表即可,代碼如下:

class Solution {
public:
    ListNode *rotateRight(ListNode *head, int k) {
        if (!head) return NULL;
        int n = 1;
        ListNode *cur = head;
        while (cur->next) {
            ++n;
            cur = cur->next;
        }
        cur->next = head;
        int m = n - k % n;
        for (int i = 0; i < m; ++i) {
            cur = cur->next;
        }
        ListNode *newhead = cur->next;
        cur->next = NULL;
        return newhead;
    }
};

到此,關于“C++實現旋轉鏈表”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

青岛市| 伽师县| 调兵山市| 木兰县| 建瓯市| 临洮县| 屯留县| 乃东县| 高碑店市| 光泽县| 木兰县| 黄石市| 桑日县| 台安县| 安龙县| 新乡县| 施甸县| 曲松县| 汾阳市| 洪洞县| 保定市| 崇明县| 邯郸县| 抚宁县| 项城市| 花垣县| 孝感市| 封丘县| 阳新县| 含山县| 唐海县| 开平市| 高淳县| 同仁县| 永善县| 靖江市| 瑞丽市| 湛江市| 托克逊县| 深泽县| 南部县|