C++實(shí)現(xiàn)LeetCode(61.旋轉(zhuǎn)鏈表)
[LeetCode] 61. Rotate List 旋轉(zhuǎn)鏈表
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
這道旋轉(zhuǎn)鏈表的題和之前那道 Rotate Array 很類似,但是比那道要難一些,因?yàn)殒湵淼闹挡荒芡ㄟ^下表來訪問,只能一個(gè)一個(gè)的走,博主剛開始拿到這題首先想到的就是用快慢指針來解,快指針先走k步,然后兩個(gè)指針一起走,當(dāng)快指針走到末尾時(shí),慢指針的下一個(gè)位置是新的順序的頭結(jié)點(diǎn),這樣就可以旋轉(zhuǎn)鏈表了,自信滿滿的寫完程序,放到 OJ 上跑,以為能一次通過,結(jié)果跪在了各種特殊情況,首先一個(gè)就是當(dāng)原鏈表為空時(shí),直接返回NULL,還有就是當(dāng)k大于鏈表長度和k遠(yuǎn)遠(yuǎn)大于鏈表長度時(shí)該如何處理,需要首先遍歷一遍原鏈表得到鏈表長度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; } };
這道題還有一種解法,跟上面的方法類似,但是不用快慢指針,一個(gè)指針就夠了,原理是先遍歷整個(gè)鏈表獲得鏈表長度n,然后此時(shí)把鏈表頭和尾鏈接起來,在往后走 n - k%n 個(gè)節(jié)點(diǎn)就到達(dá)新鏈表的頭結(jié)點(diǎn)前一個(gè)點(diǎn),這時(shí)斷開鏈表即可,代碼如下:
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; } };
到此這篇關(guān)于C++實(shí)現(xiàn)LeetCode(61.旋轉(zhuǎn)鏈表)的文章就介紹到這了,更多相關(guān)C++實(shí)現(xiàn)旋轉(zhuǎn)鏈表內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
與ASCII碼相關(guān)的C語言字符串操作函數(shù)
這篇文章主要介紹了與ASCII碼相關(guān)的C語言字符串操作函數(shù),分別是將字符轉(zhuǎn)換為ASCII碼的toascii()函數(shù)和根據(jù)ASCII碼進(jìn)行字符串比較的strcoll()函數(shù),需要的朋友可以參考下2015-08-08C語言實(shí)現(xiàn)學(xué)生成績管理系統(tǒng)實(shí)戰(zhàn)教學(xué)
在本篇文章里小編給大家分享了關(guān)于C語言實(shí)現(xiàn)學(xué)生成績管理系統(tǒng)實(shí)戰(zhàn)教學(xué)內(nèi)容,有興趣的朋友們可以跟著學(xué)習(xí)參考下。2019-01-01C++實(shí)現(xiàn)拼圖游戲代碼(graphics圖形庫)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)拼圖游戲代碼,帶有g(shù)raphics圖形庫,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05C/C++實(shí)現(xiàn)發(fā)送與接收HTTP/S請求的示例代碼
HTTP(Hypertext Transfer Protocol)是一種用于傳輸超文本的協(xié)議,它是一種無狀態(tài)的、應(yīng)用層的協(xié)議,用于在計(jì)算機(jī)之間傳輸超文本文檔,通常在 Web 瀏覽器和 Web 服務(wù)器之間進(jìn)行數(shù)據(jù)通信,本文給大家介紹了C/C++發(fā)送與接收HTTP/S請求,需要的朋友可以參考下2023-11-11C++實(shí)現(xiàn)棧的操作(push和pop)
這篇文章主要介紹了C++實(shí)現(xiàn)棧的操作(push和pop),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07C語言中#define在多行宏定義出錯(cuò)的原因及分析
這篇文章主要介紹了C語言中#define在多行宏定義出錯(cuò)的原因及分析,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02