📑 题目:61. 旋转链表

🚀 本题 LeetCode 传送门

题目大意

旋转链表 K 次。

解题思路

这道题需要注意的点是,K 可能很大,K = 2000000000 ,如果是循环肯定会超时。应该找出 O(n) 的复杂度的算法才行。由于是循环旋转,最终状态其实是确定的,利用链表的长度取余可以得到链表的最终旋转结果。

这道题也不能用递归,递归解法会超时。

代码

  1. package leetcode
  2. /**
  3. * Definition for singly-linked list.
  4. * type ListNode struct {
  5. * Val int
  6. * Next *ListNode
  7. * }
  8. */
  9. func rotateRight(head *ListNode, k int) *ListNode {
  10. if head == nil || head.Next == nil || k == 0 {
  11. return head
  12. }
  13. newHead := &ListNode{Val: 0, Next: head}
  14. len := 0
  15. cur := newHead
  16. for cur.Next != nil {
  17. len++
  18. cur = cur.Next
  19. }
  20. if (k % len) == 0 {
  21. return head
  22. }
  23. cur.Next = head
  24. cur = newHead
  25. for i := len - k%len; i > 0; i-- {
  26. cur = cur.Next
  27. }
  28. res := &ListNode{Val: 0, Next: cur.Next}
  29. cur.Next = nil
  30. return res.Next
  31. }