Skip to content

Commit 0483037

Browse files
committed
[LinkedList] Add a solution to Reverse Nodes in k-Group
1 parent 5cd3d6a commit 0483037

File tree

1 file changed

+49
-0
lines changed

1 file changed

+49
-0
lines changed

LinkedList/ReverseNodesInKGroup.swift

+49
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
/**
2+
* Question Link: https://leetcode.com/problems/reverse-nodes-in-k-group/
3+
* Primary idea: Reverse one group during one loop. Construct a reversed group from back to forth.
4+
* Time Complexity: O(n), Space Complexity: O(1)
5+
*
6+
* Definition for singly-linked list.
7+
* public class ListNode {
8+
* public var val: Int
9+
* public var next: ListNode?
10+
* public init(_ val: Int) {
11+
* self.val = val
12+
* self.next = nil
13+
* }
14+
* }
15+
*/
16+
17+
class ReverseNodesInKGroup {
18+
func reverseKGroup(_ head: ListNode?, _ k: Int) -> ListNode? {
19+
let dummy = ListNode(0)
20+
dummy.next = head
21+
22+
var prev = dummy // prev = A
23+
while prev.next != nil { // A->B->C->D->E => A->D->C->B->E
24+
var groupTail : ListNode? = prev
25+
for _ in 1...k {
26+
groupTail = groupTail?.next
27+
}
28+
guard groupTail != nil else { // groupTail = D
29+
break
30+
}
31+
32+
let nextGroupHead = groupTail!.next // nextGroupHead = E
33+
var last = nextGroupHead // last = E
34+
var current : ListNode? = prev.next! // current = B
35+
while current != nil && current !== nextGroupHead {
36+
let next = current!.next // next = C
37+
current!.next = last // B -> E
38+
last = current // last = B
39+
current = next // current = C
40+
}
41+
42+
groupTail = prev.next
43+
prev.next = last
44+
prev = groupTail!
45+
}
46+
47+
return dummy.next
48+
}
49+
}

0 commit comments

Comments
 (0)