給定乙個鍊錶,旋轉鍊錶,將鍊錶每個節點向右移動 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->1->2->null, k = 4
輸出: 2->0->1->null
解釋:向右旋轉 1 步: 2->0->1->null
向右旋轉 2 步: 1->2->0->null
向右旋轉 3 步: 0->1->2->null
向右旋轉 4 步: 2->0->1->null
首先,通過遍歷整個鍊錶,得到鍊錶的長度和鍊錶的尾結點,使用struct listnode *end
變數將尾結點記錄下來,然後,將k對鍊錶長度求餘,得到實際旋轉次數,遍歷鍊錶,得到經過k次旋轉後鍊錶的頭結點
使用struct listnode *new_head
變數將新的頭結點記錄下來。最後,將尾指標指向頭結點,使煉表成環,再將新的頭結點與前面的結點斷開,可得到經過k次旋轉後的鍊錶。
struct listnode*
rotateright
(struct listnode* head,
int k)
int len=1;
//沒有執行if語句,表示鍊錶不為空,可以直接將長度設為1
struct listnode *p;
//遍歷鍊錶,求長度,尋找旋轉後的頭結點
struct listnode *end;
//最後乙個元素
struct listnode *new_head;
//新的頭結點
p=head;
//使p指向第乙個結點
//遍歷鍊錶,求鍊錶的長度
while
(p->next!=
null
) end=p;
//儲存最後乙個元素
k=k%len;
//k對len求餘,得到實際旋轉次數
if(k==0)
p=head;
for(
int i=
0;i1;i++
) new_head=p->next;
//儲存新的頭結點
end->next=head;
//尾指標指向頭結點,形成環
head=new_head;
p->next=
null
;//斷鏈
return head;
}
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...