C 實現LeetCode 61 旋轉鍊錶

2022-09-24 22:24:13 字數 1180 閱讀 3841

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:

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

解法一:

class solution

k %= n;

listnode *fast = head, *slow = head;

for (int i = 0; i < k; ++i)

if (!fast) return head;

while (fast->next)

fast->next = head;

fast = slow->next;

slow->next = null;

return fast;}};

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

class solution

cur->next = head;

int m = n - k % n;

for (int i = 0; i < m; ++i)

listnode *newhead = cur->next;

cur->next = null;

return newhead;}};

leetcode 61 旋轉鍊錶

deciription 給定乙個鍊錶,旋轉鍊錶,將鍊錶每個節點向右移動 k 個位置,其中 k 是非負數。示例 1 輸入 1 2 3 4 5 null,k 2 輸出 4 5 1 2 3 null 解釋 向右旋轉 1 步 5 1 2 3 4 null 向右旋轉 2 步 4 5 1 2 3 null示例 ...

LeetCode61 旋轉鍊錶

很久沒有寫blog了,以至於很長一段時間我都忘記了我還有乙個csdn賬號。也就是每週參加以下leetcode周競賽,膜拜一下大佬,然後發現自己真的是蠢以及一無是處,想的辦法總是,非常蠢。一般就做簡單的題目,這道題是leetcode估計實在是看不下去了,給我email說邀請我做個演算法題,我看了一下,...

LeetCode 61 旋轉鍊錶

問題描述 給定乙個鍊錶,旋轉鍊錶,將鍊錶每個節點向右移動 k 個位置,其中 k 是非負數。示例 1 輸入 1 2 3 4 5 null,k 2 輸出 4 5 1 2 3 null 解釋 向右旋轉 1 步 5 1 2 3 4 null 向右旋轉 2 步 4 5 1 2 3 null 示例 2 輸入 0...