题目

给定一个链表,旋转链表,将链表每个节点向右移动 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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/rotate-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解

1.双指针
left 和 right指针
right指针先走K步,然后两个指针一起走,当right到尾部时,left正好到倒数k + 1个指针
断链,right指向头部,返回left下一个作为head即可
注:如果right === head,说明不用移动

  1. /**
  2. * Definition for singly-linked list.
  3. * function ListNode(val, next) {
  4. * this.val = (val===undefined ? 0 : val)
  5. * this.next = (next===undefined ? null : next)
  6. * }
  7. */
  8. /**
  9. * @param {ListNode} head
  10. * @param {number} k
  11. * @return {ListNode}
  12. */
  13. var rotateRight = function (head, k) {
  14. if (!head) {
  15. return head
  16. }
  17. let left = head
  18. let right = head
  19. while (k > 0) {
  20. if (!right.next) {
  21. right = head
  22. } else {
  23. right = right.next
  24. }
  25. k--
  26. }
  27. if (left === right) {
  28. return head
  29. }
  30. while (right.next) {
  31. left = left.next
  32. right = right.next
  33. }
  34. const temp = left.next
  35. left.next = null
  36. right.next = head
  37. return temp
  38. };