看一百遍美女,美女也不一定是你的。但你刷一百遍算法,知识就是你的了~~
谁能九层台,不用累土起。
题目
给你一个链表的头节点head,旋转链表,将链表每个节点向右移动k个位置。
示例 1:
输入: head = [1,2,3,4,5], k = 2
输出: [4,5,1,2,3]
示例 2:
输入: head = [0,1,2], k = 4
输出: [2,0,1]
提示:
- 链表中节点的数目在范围
[0, 500]内-100 <= Node.val <= 1000 <= k <= 2 * 109
解题思路
- 将尾结点指向
head - 将尾结点的前置节点指向
null - 重复
k次上面的动作
解题代码
var rotateRight = function(head, k) {
if(!head) return head
let list = head
while(k--){
list = doRotate(list)
}
return list
};
var doRotate = function(head){
let cur = head
while(cur.next&&cur.next.next){
cur = cur.next
}
if(!cur.next) return cur
cur.next.next = head
let z = cur.next
cur.next = null
return z
}
遇到了一些问题
使用如上的解法,看着没有毛病,但是在k的值特别大时,会超时
优化方案
- 我们先获取到链表的长度
i - 用
k对i取余得到我们要旋转的最小次数con - 进行
con次旋转
最终解题代码
var rotateRight = function(head, k) {
if(!head) return head
let i = 1
let cur = head
while (cur.next){
cur = cur.next
i++
}
let con = k%i
let list = head
while(con--){
list = doRotate(list)
}
return list
};
var doRotate = function(head){
let cur = head
while(cur.next&&cur.next.next){
cur = cur.next
}
if(!cur.next) return cur
cur.next.next = head
let z = cur.next
cur.next = null
return z
}
如有任何问题或建议,欢迎留言讨论!