1.题目

61. 旋转链表

难度中等653
61. 旋转链表 - 图1
给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。

示例 1:
输入:head = [1,2,3,4,5], k = 2 输出:[4,5,1,2,3]
61. 旋转链表 - 图2
示例 2:
输入:head = [0,1,2], k = 4 输出:[2,0,1]

提示:

  • 链表中节点的数目在范围 [0, 500] 内
  • -100 <= Node.val <= 100
  • 0 <= k <= 2 * 109

    2.题解

    解题思路

迭代法,题目其实就是把那些尾部的放到头部。其实就是对长度 以外的再去求余数,然后将他截断两端,后端的放到前面去。一个整体。然后要注意的是,需要对k=0,没有头节点,以及只有一个节点的做特殊处理。以及k可能被len求余为0,也不需要去旋转了。还有分割节点需要用一个新的变量指针去指。

代码

  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 || k === 0 || !head.next) return head;
  15. let len = 0;
  16. let p = head;
  17. while(p) {
  18. p = p.next;
  19. len++;
  20. }
  21. let blockNum = k % len;
  22. if(blockNum === 0) {
  23. return head;
  24. }
  25. // 将倒数几个移动到最前面。
  26. let restNum = len - blockNum;
  27. let prevQ = new ListNode(-1);
  28. prevQ.next = head;
  29. while(restNum) {
  30. prevQ = prevQ.next;
  31. restNum--;
  32. }
  33. let cur = prevQ;
  34. let next = cur.next;
  35. cur.next = null;
  36. let listNode = next;
  37. while(listNode && listNode.next) {
  38. listNode = listNode.next;
  39. }
  40. listNode.next = head;
  41. return next;
  42. };