题目
给定一个链表,旋转链表,将链表每个节点向右移动 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,说明不用移动
/*** Definition for singly-linked list.* function ListNode(val, next) {* this.val = (val===undefined ? 0 : val)* this.next = (next===undefined ? null : next)* }*//*** @param {ListNode} head* @param {number} k* @return {ListNode}*/var rotateRight = function (head, k) {if (!head) {return head}let left = headlet right = headwhile (k > 0) {if (!right.next) {right = head} else {right = right.next}k--}if (left === right) {return head}while (right.next) {left = left.nextright = right.next}const temp = left.nextleft.next = nullright.next = headreturn temp};
