# [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 } ```