61. 旋转链表

题目链接:https://leetcode-cn.com/problems/rotate-list/
解法一和链表倒数第k个节点一样。

执行用时:12 ms, 在所有 Swift 提交中击败了78.65%的用户
内存消耗:13.6 MB, 在所有 Swift 提交中击败了17.98%的用户

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
class Solution {
func rotateRight(_ head: ListNode?, _ k: Int) -> ListNode? {
if head == nil {
return nil
}
var slow = head, fast = head, len = 0
var p = head
while p != nil {
p = p?.next
len += 1
}
let step = k % len
for i in 0 ..< step {
fast = fast?.next
}
while fast?.next != nil {
slow = slow?.next
fast = fast?.next
}
fast?.next = head
p = slow?.next
slow?.next = nil
return p
}
}

解法二是将尾指针指向了头节点,形成了环。

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
28
29
30
31
32
/**
* Definition for singly-linked list.
* public class ListNode {
* public var val: Int
* public var next: ListNode?
* public init() { self.val = 0; self.next = nil; }
* public init(_ val: Int) { self.val = val; self.next = nil; }
* public init(_ val: Int, _ next: ListNode?) { self.val = val; self.next = next; }
* }
*/
class Solution {
func rotateRight(_ head: ListNode?, _ k: Int) -> ListNode? {
if head == nil {
return nil
}
var len = 1
var p = head
while p?.next != nil {
p = p?.next
len += 1
}
let step = len - k % len
p?.next = head
var newHead = head
for i in 0 ..< step {
p = p?.next
newHead = newHead?.next
}
p?.next = nil
return newHead
}
}

61. 旋转链表
https://pisces34.github.io/2021/09/19/leetcode/61/
发布于
2021年9月19日
许可协议