LeetCode-61-旋转链表

看一百遍美女,美女也不一定是你的。但你刷一百遍算法,知识就是你的了~~

谁能九层台,不用累土起。

题目地址

题目

给你一个链表的头节点head,旋转链表,将链表每个节点向右移动k个位置。

示例 1:

image.png

1
2
输入: head = [1,2,3,4,5], k = 2
输出: [4,5,1,2,3]

示例 2:

image.png

1
2
输入: head = [0,1,2], k = 4
输出: [2,0,1]

提示:

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

解题思路

  • 将尾结点指向head
  • 将尾结点的前置节点指向null
  • 重复k次上面的动作

解题代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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的值特别大时,会超时

image.png

优化方案

  • 我们先获取到链表的长度i
  • ki取余得到我们要旋转的最小次数con
  • 进行con次旋转

最终解题代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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
}
文章作者: Joker
文章链接: https://qytayh.github.io/2021/12/LeetCode-61-%E6%97%8B%E8%BD%AC%E9%93%BE%E8%A1%A8/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Joker's Blog