61,旋转链表
题目描述
给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。
示例
输入:head = [1,2,3,4,5], k = 2
输出:[4,5,1,2,3]
题解
思路:
思路:
计算链表的长度
如果链表的长度是k的倍数的时候或者是链表长度为1的时候,就直接返回原链表即可
其他情况:通过快慢指针去找到倒数第k个节点,进行断开,拼接到头结点的位置
代码:
var rotateRight = function(head, k) {
if(!head) return null
let count = 1, i = head, newNode = new ListNode(0,head)
// 记录链表的长度
while(i.next){
count++
i = i.next
}
k = k % count
// 判断是否不用分割的情况
if(k == 0 || count <= 1) return head
// 记录尾节点
let last = i
// 声明快慢指针
let fast = head, slow = head,j = 0
// 快慢指针循环,找到需要断开的地方
while(fast){
fast = fast.next
if(j > k){
slow = slow.next
}
j++
}
// 调整位置
last.next = newNode.next
newNode.next = slow.next
slow.next = null
return newNode.next
};