mirror of
https://github.com/halfrost/LeetCode-Go.git
synced 2025-07-30 23:52:03 +08:00
81 lines
1.6 KiB
Markdown
81 lines
1.6 KiB
Markdown
# [61. Rotate List](https://leetcode.com/problems/rotate-list/description/)
|
||
|
||
## 题目
|
||
|
||
Given a linked list, rotate the list to the right by k places, where k is non-negative.
|
||
|
||
**Example 1**:
|
||
|
||
```
|
||
|
||
Input: 1->2->3->4->5->NULL, k = 2
|
||
Output: 4->5->1->2->3->NULL
|
||
Explanation:
|
||
rotate 1 steps to the right: 5->1->2->3->4->NULL
|
||
rotate 2 steps to the right: 4->5->1->2->3->NULL
|
||
|
||
```
|
||
|
||
**Example 2**:
|
||
|
||
```
|
||
|
||
Input: 0->1->2->NULL, k = 4
|
||
Output: 2->0->1->NULL
|
||
Explanation:
|
||
rotate 1 steps to the right: 2->0->1->NULL
|
||
rotate 2 steps to the right: 1->2->0->NULL
|
||
rotate 3 steps to the right: 0->1->2->NULL
|
||
rotate 4 steps to the right: 2->0->1->NULL
|
||
|
||
```
|
||
|
||
## 题目大意
|
||
|
||
旋转链表 K 次。
|
||
|
||
|
||
## 解题思路
|
||
|
||
这道题需要注意的点是,K 可能很大,K = 2000000000 ,如果是循环肯定会超时。应该找出 O(n) 的复杂度的算法才行。由于是循环旋转,最终状态其实是确定的,利用链表的长度取余可以得到链表的最终旋转结果。
|
||
|
||
这道题也不能用递归,递归解法会超时。
|
||
|
||
## 代码
|
||
|
||
```go
|
||
|
||
package leetcode
|
||
|
||
/**
|
||
* Definition for singly-linked list.
|
||
* type ListNode struct {
|
||
* Val int
|
||
* Next *ListNode
|
||
* }
|
||
*/
|
||
func rotateRight(head *ListNode, k int) *ListNode {
|
||
if head == nil || head.Next == nil || k == 0 {
|
||
return head
|
||
}
|
||
newHead := &ListNode{Val: 0, Next: head}
|
||
len := 0
|
||
cur := newHead
|
||
for cur.Next != nil {
|
||
len++
|
||
cur = cur.Next
|
||
}
|
||
if (k % len) == 0 {
|
||
return head
|
||
}
|
||
cur.Next = head
|
||
cur = newHead
|
||
for i := len - k%len; i > 0; i-- {
|
||
cur = cur.Next
|
||
}
|
||
res := &ListNode{Val: 0, Next: cur.Next}
|
||
cur.Next = nil
|
||
return res.Next
|
||
}
|
||
|
||
``` |