您好,登錄后才能下訂單哦!
這篇文章主要介紹“C++實現旋轉鏈表”,在日常操作中,相信很多人在C++實現旋轉鏈表問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C++實現旋轉鏈表”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
Given the head of a linked list, rotate the list to the right by k places.
Example 1:
Input: head = [1,2,3,4,5], k = 2
Output: [4,5,1,2,3]
Example 2:
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++實現旋轉鏈表”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。