Skip to content

Commit c3da1cd

Browse files
committed
25. Reverse Nodes in k-Group
```Solution.c /** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ struct ListNode* reverseLinkedList(struct ListNode* head, int k) { struct ListNode* prev = NULL; struct ListNode* curr = head; while (k > 0) { struct ListNode* next = curr->next; curr->next = prev; prev = curr; curr = next; k--; } return prev; } struct ListNode* reverseKGroup(struct ListNode* head, int k) { struct ListNode* curr = head; int count = 0; while (curr != NULL && count < k) { curr = curr->next; count++; } if (count == k) { struct ListNode* reversedHead = reverseLinkedList(head, k); head->next = reverseKGroup(curr, k); return reversedHead; } return head; } ``` ```Solution.cpp /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */ class Solution { public: ListNode* reverseKGroup(ListNode* head, int k) { ListNode* curr = head; int count = 0; while (curr != nullptr && count < k) { curr = curr->next; count++; } if (count == k) { ListNode* reversedHead = reverseLinkedList(head, k); head->next = reverseKGroup(curr, k); return reversedHead; } return head; } private: ListNode* reverseLinkedList(ListNode* head, int k) { ListNode* prev = nullptr; ListNode* curr = head; while (k--) { ListNode* next = curr->next; curr->next = prev; prev = curr; curr = next; } return prev; } }; ``` ```Solution.cs /** * Definition for singly-linked list. * public class ListNode { * public int val; * public ListNode next; * public ListNode(int val=0, ListNode next=null) { * this.val = val; * this.next = next; * } * } */ public class Solution { public ListNode ReverseKGroup(ListNode head, int k) { ListNode curr = head; int count = 0; while (curr != null && count < k) { curr = curr.next; count++; } if (count == k) { ListNode reversedHead = ReverseLinkedList(head, k); head.next = ReverseKGroup(curr, k); return reversedHead; } return head; } private ListNode ReverseLinkedList(ListNode head, int k) { ListNode prev = null; ListNode curr = head; while (k > 0) { ListNode next = curr.next; curr.next = prev; prev = curr; curr = next; k--; } return prev; } } ``` ```Solution.dart /** * Definition for singly-linked list. * class ListNode { * int val; * ListNode? next; * ListNode([this.val = 0, this.next]); * } */ class Solution { ListNode? reverseKGroup(ListNode? head, int k) { ListNode? curr = head; int count = 0; while (curr != null && count < k) { curr = curr.next; count++; } if (count == k) { final reversedHead = reverseLinkedList(head, k); head?.next = reverseKGroup(curr, k); return reversedHead; } return head; } ListNode? reverseLinkedList(ListNode? head, int k) { ListNode? prev = null; ListNode? curr = head; int remainingK = k; while (remainingK > 0 && curr != null) { final next = curr.next; curr.next = prev; prev = curr; curr = next; remainingK--; } return prev; } } ``` ```Solution.erl %% Definition for singly-linked list. %% %% -record(list_node, {val = 0 :: integer(), %% next = null :: 'null' | #list_node{}}). -spec reverse_k_group(Head :: #list_node{} | null, K :: integer()) -> #list_node{} | null. reverse_k_group(Head, K) when K =< 1 -> Head; reverse_k_group(Head, K) when Head =:= null -> null; reverse_k_group(Head, K) -> List = to_list(Head), NewList = reverse_k_chunks(List, K), from_list(NewList). to_list(null) -> []; to_list(#list_node{val = V, next = Next}) -> [V | to_list(Next)]. from_list([]) -> null; from_list([H | T]) -> #list_node{val = H, next = from_list(T)}. reverse_k_chunks(List, K) -> Groups = reverse_k_chunks(List, K, []), lists:append(Groups). reverse_k_chunks([], _K, Acc) -> lists:reverse(Acc); reverse_k_chunks(List, K, Acc) -> {Chunk, Rest, Len} = take_chunk(List, K, [], 0), Group = if Len == K -> Chunk; true -> lists:reverse(Chunk) end, reverse_k_chunks(Rest, K, [Group | Acc]). take_chunk(Rest, 0, Chunk, Len) -> {Chunk, Rest, Len}; take_chunk([], _K, Chunk, Len) -> {Chunk, [], Len}; take_chunk([H | T], K, Chunk, Len) -> take_chunk(T, K - 1, [H | Chunk], Len + 1). ``` ```Solution.ex # Definition for singly-linked list. # # defmodule ListNode do # @type t :: %__MODULE__{ # val: integer, # next: ListNode.t() | nil # } # defstruct val: 0, next: nil # end defmodule Solution do @SPEC reverse_k_group(head :: ListNode.t | nil, k :: integer) :: ListNode.t | nil def reverse_k_group(head, k) when k <= 1 or head == nil, do: head def reverse_k_group(head, k) do {nodes, rest, count} = take_nodes(head, k, [], 0) if count < k do head else rest_rev = reverse_k_group(rest, k) build_reversed(nodes, rest_rev) end end defp take_nodes(node, 0, acc, count), do: {Enum.reverse(acc), node, count} defp take_nodes(nil, _k, acc, count), do: {Enum.reverse(acc), nil, count} defp take_nodes(%ListNode{} = node, k, acc, count) do take_nodes(node.next, k - 1, [node | acc], count + 1) end defp build_reversed([], acc), do: acc defp build_reversed([%ListNode{val: v} | t], acc) do build_reversed(t, %ListNode{val: v, next: acc}) end end ``` ```Solution.go /** * Definition for singly-linked list. * type ListNode struct { * Val int * Next *ListNode * } */ func reverseKGroup(head *ListNode, k int) *ListNode { curr := head count := 0 for curr != nil && count < k { curr = curr.Next count++ } if count == k { reversedHead := reverseLinkedList(head, k) head.Next = reverseKGroup(curr, k) return reversedHead } return head } func reverseLinkedList(head *ListNode, k int) *ListNode { var prev *ListNode = nil curr := head for k > 0 && curr != nil { next := curr.Next curr.Next = prev prev = curr curr = next k-- } return prev } ``` ```Solution.java /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next; } * } */ class Solution { public ListNode reverseKGroup(ListNode head, int k) { ListNode curr = head; int count = 0; while (curr != null && count < k) { curr = curr.next; count++; } if (count == k) { ListNode reversedHead = reverseLinkedList(head, k); head.next = reverseKGroup(curr, k); return reversedHead; } return head; } private ListNode reverseLinkedList(ListNode head, int k) { ListNode prev = null; ListNode curr = head; while (k > 0) { ListNode next = curr.next; curr.next = prev; prev = curr; curr = next; k--; } return prev; } } ``` ```Solution.js /** * Definition for singly-linked list. * function ListNode(val, next) { * this.val = (val===undefined ? 0 : val) * this.next = (next===undefined ? null : next) * } */ /** * @param {ListNode} head * @param {number} k * @return {ListNode} */ var reverseKGroup = function(head, k) { let curr = head; let count = 0; while (curr !== null && count < k) { curr = curr.next; count++; } if (count === k) { const reversedHead = reverseLinkedList(head, k); head.next = reverseKGroup(curr, k); return reversedHead; } return head; }; /** * Reverses a linked list of size k and returns the new head. * @param {ListNode} head * @param {number} k * @return {ListNode} */ function reverseLinkedList(head, k) { let prev = null; let curr = head; while (k > 0) { const next = curr.next; curr.next = prev; prev = curr; curr = next; k--; } return prev; } ``` ```Solution.kt /** * Example: * var li = ListNode(5) * var v = li.`val` * Definition for singly-linked list. * class ListNode(var `val`: Int) { * var next: ListNode? = null * } */ class Solution { fun reverseKGroup(head: ListNode?, k: Int): ListNode? { var curr = head var count = 0 while (curr != null && count < k) { curr = curr.next count++ } if (count == k) { val reversedHead = reverseLinkedList(head, k) // Recursively process the remaining list head?.next = reverseKGroup(curr, k) return reversedHead } return head } private fun reverseLinkedList(head: ListNode?, k: Int): ListNode? { var prev: ListNode? = null var curr = head var remainingK = k while (remainingK > 0 && curr != null) { val next = curr.next curr.next = prev prev = curr curr = next remainingK-- } return prev } } ``` ```Solution.php /** * Definition for a singly-linked list. * class ListNode { * public $val = 0; * public $next = null; * function __construct($val = 0, $next = null) { * $this->val = $val; * $this->next = $next; * } * } */ class Solution { /** * @param ListNode $head * @param Integer $k * @return ListNode */ function reverseKGroup($head, $k) { $curr = $head; $count = 0; while ($curr !== null && $count < $k) { $curr = $curr->next; $count++; } if ($count === $k) { $reversedHead = $this->reverseLinkedList($head, $k); // Recursively process the remaining list $head->next = $this->reverseKGroup($curr, $k); return $reversedHead; } return $head; } /** * Reverses a linked list of size k and returns the new head. * @param ListNode $head * @param Integer $k * @return ListNode */ private function reverseLinkedList($head, $k) { $prev = null; $curr = $head; while ($k > 0) { $next = $curr->next; $curr->next = $prev; $prev = $curr; $curr = $next; $k--; } return $prev; } } ``` ```Solution.py # Definition for singly-linked list. # class ListNode: # def __init__(self, val=0, next=None): # self.val = val # self.next = next class Solution: def reverseKGroup(self, head: Optional[ListNode], k: int) -> Optional[ListNode]: curr = head count = 0 while curr and count < k: curr = curr.next count += 1 if count == k: reversed_head = self.reverseLinkedList(head, k) head.next = self.reverseKGroup(curr, k) return reversed_head return head def reverseLinkedList(self, head: Optional[ListNode], k: int) -> Optional[ListNode]: prev = None curr = head while k > 0: next_node = curr.next curr.next = prev prev = curr curr = next_node k -= 1 return prev ``` ```Solution.rb # Definition for singly-linked list. # class ListNode # attr_accessor :val, :next # def initialize(val = 0, _next = nil) # @Val = val # @next = _next # end # end # @param {ListNode} head # @param {Integer} k # @return {ListNode} def reverse_k_group(head, k) curr = head count = 0 while curr != nil && count < k curr = curr.next count += 1 end if count == k reversed_head = reverse_linked_list(head, k) head.next = reverse_k_group(curr, k) return reversed_head end head end def reverse_linked_list(head, k) prev = nil curr = head while k > 0 && curr != nil next_node = curr.next curr.next = prev prev = curr curr = next_node k -= 1 end prev end ``` ```Solution.rkt ; Definition for singly-linked list: #| ; val : integer? ; next : (or/c list-node? #f) (struct list-node (val next) #:mutable #:transparent) ; constructor (define (make-list-node [val 0]) (list-node val #f)) |# (define (reverse-k-group head k) (define (has-k? node k) (let loop ([n node] [i 0]) (cond [(= i k) #t] [(not n) #f] [else (loop (list-node-next n) (add1 i))]))) (define (reverse-first-k node k) (let loop ([curr node] [prev #f] [i 0]) (if (= i k) (values prev curr) (let ([next (list-node-next curr)]) (set-list-node-next! curr prev) (loop next curr (add1 i)))))) (define (process curr new-head last-tail) (if (not curr) new-head (if (has-k? curr k) (let-values ([(rev-head rest) (reverse-first-k curr k)]) (when last-tail (set-list-node-next! last-tail rev-head)) (process rest (or new-head rev-head) curr)) (begin (when last-tail (set-list-node-next! last-tail curr)) (if new-head new-head curr))))) (process head #f #f)) ``` ```Solution.rs // Definition for singly-linked list. // #[derive(PartialEq, Eq, Clone, Debug)] // pub struct ListNode { // pub val: i32, // pub next: Option<Box<ListNode>> // } // impl ListNode { // #[inline] // fn new(val: i32) -> Self { // ListNode { // next: None, // val // } // } // } impl Solution { pub fn reverse_k_group(head: Option<Box<ListNode>>, k: i32) -> Option<Box<ListNode>> { let k_usize = k as usize; let mut count = 0; let mut ptr = &head; while let Some(node) = ptr { count += 1; if count == k_usize { break; } ptr = &node.next; } if count < k_usize { return head; } let (mut reversed_head, remainder) = Self::reverse_linked_list(head, k_usize); if let Some(ref mut node) = reversed_head { let mut tail = node.as_mut(); while let Some(ref mut next_node) = tail.next { tail = next_node.as_mut(); } tail.next = Self::reverse_k_group(remainder, k); } reversed_head } fn reverse_linked_list(mut head: Option<Box<ListNode>>, k: usize) -> (Option<Box<ListNode>>, Option<Box<ListNode>>) { let mut prev: Option<Box<ListNode>> = None; let mut curr = head.take(); let mut remaining_k = k; while remaining_k > 0 { if let Some(mut node) = curr { let next = node.next.take(); node.next = prev; prev = Some(node); curr = next; remaining_k -= 1; } else { break; } } (prev, curr) } } ``` ```Solution.scala /** * Definition for singly-linked list. * class ListNode(_x: Int = 0, _next: ListNode = null) { * var next: ListNode = _next * var x: Int = _x * } */ object Solution { def reverseKGroup(head: ListNode, k: Int): ListNode = { var curr: ListNode = head var count: Int = 0 while (curr != null && count < k) { curr = curr.next count += 1 } if (count == k) { val reversedHead: ListNode = reverseLinkedList(head, k) // Recursively process the remaining list head.next = reverseKGroup(curr, k) return reversedHead } head } def reverseLinkedList(head: ListNode, k: Int): ListNode = { var prev: ListNode = null var curr: ListNode = head var remainingK: Int = k while (remainingK > 0 && curr != null) { val next: ListNode = curr.next curr.next = prev prev = curr curr = next remainingK -= 1 } prev } } ``` ```Solution.swift /** * 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 reverseKGroup(_ head: ListNode?, _ k: Int) -> ListNode? { var curr = head var count = 0 while curr != nil && count < k { curr = curr?.next count += 1 } if count == k { let reversedHead = reverseLinkedList(head, k) head?.next = reverseKGroup(curr, k) return reversedHead } return head } private func reverseLinkedList(_ head: ListNode?, _ k: Int) -> ListNode? { var prev: ListNode? = nil var curr = head var remainingK = k while remainingK > 0 && curr != nil { let next = curr?.next curr?.next = prev prev = curr curr = next remainingK -= 1 } return prev } } ``` ```Solution.ts /** * Definition for singly-linked list. * class ListNode { * val: number * next: ListNode | null * constructor(val?: number, next?: ListNode | null) { * this.val = (val===undefined ? 0 : val) * this.next = (next===undefined ? null : next) * } * } */ function reverseKGroup(head: ListNode | null, k: number): ListNode | null { let curr: ListNode | null = head; let count: number = 0; while (curr !== null && count < k) { curr = curr.next; count++; } if (count === k) { const reversedHead: ListNode | null = reverseLinkedList(head, k); if (head !== null) { head.next = reverseKGroup(curr, k); } return reversedHead; } return head; } function reverseLinkedList(head: ListNode | null, k: number): ListNode | null { let prev: ListNode | null = null; let curr: ListNode | null = head; while (k > 0 && curr !== null) { const next: ListNode | null = curr.next; curr.next = prev; prev = curr; curr = next; k--; } return prev; } ```
1 parent 15d4902 commit c3da1cd

21 files changed

+715
-0
lines changed

res/ino/483119582.jpg

18.9 KB
Loading

res/ino/483119823.jpg

18.4 KB
Loading
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# [**25. Reverse Nodes in k-Group**](https://leetcode.com/problems/reverse-nodes-in-k-group/description/)
2+
3+
Given the `head` of a linked list, reverse the nodes of the list `k` at a time, and return the modified list.
4+
5+
`k` is a positive integer and is less than or equal to the length of the linked list. If the number of nodes is not a multiple of `k` then left-out nodes, in the end, should remain as it is.
6+
7+
You may not alter the values in the list's nodes, only nodes themselves may be changed.
8+
9+
#### **Example 1:**
10+
11+
<img src="https://raw.githubusercontent.com/leetcoin-releases/leetcode/refs/heads/main/res/ino/483119582.jpg" style="width: 100%; height: 600;"/>
12+
13+
```md
14+
Input: head = [1,2,3,4,5], k = 2
15+
Output: [2,1,4,3,5]
16+
```
17+
18+
#### **Example 2:**
19+
20+
<img src="https://raw.githubusercontent.com/leetcoin-releases/leetcode/refs/heads/main/res/ino/483119823.jpg" style="width: 100%; height: 600;"/>
21+
22+
```md
23+
Input: head = [1,2,3,4,5], k = 3
24+
Output: [3,2,1,4,5]
25+
```
26+
27+
#### **Constraints:**
28+
> - The number of nodes in the list is `n`.
29+
> - `1 <= k <= n <= 5000`
30+
> - `0 <= Node.val <= 1000`
31+
32+
#### **Follow up:**
33+
```md
34+
Can you solve the problem in O(1) extra memory space?
35+
```
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/**
2+
* Definition for singly-linked list.
3+
* struct ListNode {
4+
* int val;
5+
* struct ListNode *next;
6+
* };
7+
*/
8+
struct ListNode* reverseLinkedList(struct ListNode* head, int k) {
9+
struct ListNode* prev = NULL;
10+
struct ListNode* curr = head;
11+
while (k > 0) {
12+
struct ListNode* next = curr->next;
13+
curr->next = prev;
14+
prev = curr;
15+
curr = next;
16+
k--;
17+
}
18+
return prev;
19+
}
20+
struct ListNode* reverseKGroup(struct ListNode* head, int k) {
21+
struct ListNode* curr = head;
22+
int count = 0;
23+
while (curr != NULL && count < k) {
24+
curr = curr->next;
25+
count++;
26+
}
27+
if (count == k) {
28+
struct ListNode* reversedHead = reverseLinkedList(head, k);
29+
head->next = reverseKGroup(curr, k);
30+
return reversedHead;
31+
}
32+
return head;
33+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/**
2+
* Definition for singly-linked list.
3+
* struct ListNode {
4+
* int val;
5+
* ListNode *next;
6+
* ListNode() : val(0), next(nullptr) {}
7+
* ListNode(int x) : val(x), next(nullptr) {}
8+
* ListNode(int x, ListNode *next) : val(x), next(next) {}
9+
* };
10+
*/
11+
class Solution {
12+
public:
13+
ListNode* reverseKGroup(ListNode* head, int k) {
14+
ListNode* curr = head;
15+
int count = 0;
16+
while (curr != nullptr && count < k) {
17+
curr = curr->next;
18+
count++;
19+
}
20+
if (count == k) {
21+
ListNode* reversedHead = reverseLinkedList(head, k);
22+
head->next = reverseKGroup(curr, k);
23+
return reversedHead;
24+
}
25+
return head;
26+
}
27+
private:
28+
ListNode* reverseLinkedList(ListNode* head, int k) {
29+
ListNode* prev = nullptr;
30+
ListNode* curr = head;
31+
while (k--) {
32+
ListNode* next = curr->next;
33+
curr->next = prev;
34+
prev = curr;
35+
curr = next;
36+
}
37+
return prev;
38+
}
39+
};
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/**
2+
* Definition for singly-linked list.
3+
* public class ListNode {
4+
* public int val;
5+
* public ListNode next;
6+
* public ListNode(int val=0, ListNode next=null) {
7+
* this.val = val;
8+
* this.next = next;
9+
* }
10+
* }
11+
*/
12+
public class Solution {
13+
public ListNode ReverseKGroup(ListNode head, int k) {
14+
ListNode curr = head;
15+
int count = 0;
16+
while (curr != null && count < k) {
17+
curr = curr.next;
18+
count++;
19+
}
20+
if (count == k) {
21+
ListNode reversedHead = ReverseLinkedList(head, k);
22+
head.next = ReverseKGroup(curr, k);
23+
return reversedHead;
24+
}
25+
return head;
26+
}
27+
private ListNode ReverseLinkedList(ListNode head, int k) {
28+
ListNode prev = null;
29+
ListNode curr = head;
30+
while (k > 0) {
31+
ListNode next = curr.next;
32+
curr.next = prev;
33+
prev = curr;
34+
curr = next;
35+
k--;
36+
}
37+
return prev;
38+
}
39+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/**
2+
* Definition for singly-linked list.
3+
* class ListNode {
4+
* int val;
5+
* ListNode? next;
6+
* ListNode([this.val = 0, this.next]);
7+
* }
8+
*/
9+
class Solution {
10+
ListNode? reverseKGroup(ListNode? head, int k) {
11+
ListNode? curr = head;
12+
int count = 0;
13+
while (curr != null && count < k) {
14+
curr = curr.next;
15+
count++;
16+
}
17+
if (count == k) {
18+
final reversedHead = reverseLinkedList(head, k);
19+
head?.next = reverseKGroup(curr, k);
20+
return reversedHead;
21+
}
22+
return head;
23+
}
24+
ListNode? reverseLinkedList(ListNode? head, int k) {
25+
ListNode? prev = null;
26+
ListNode? curr = head;
27+
int remainingK = k;
28+
while (remainingK > 0 && curr != null) {
29+
final next = curr.next;
30+
curr.next = prev;
31+
prev = curr;
32+
curr = next;
33+
remainingK--;
34+
}
35+
return prev;
36+
}
37+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
%% Definition for singly-linked list.
2+
%%
3+
%% -record(list_node, {val = 0 :: integer(),
4+
%% next = null :: 'null' | #list_node{}}).
5+
-spec reverse_k_group(Head :: #list_node{} | null, K :: integer()) -> #list_node{} | null.
6+
reverse_k_group(Head, K) when K =< 1 -> Head;
7+
reverse_k_group(Head, K) when Head =:= null -> null;
8+
reverse_k_group(Head, K) ->
9+
List = to_list(Head),
10+
NewList = reverse_k_chunks(List, K),
11+
from_list(NewList).
12+
to_list(null) -> [];
13+
to_list(#list_node{val = V, next = Next}) -> [V | to_list(Next)].
14+
from_list([]) -> null;
15+
from_list([H | T]) -> #list_node{val = H, next = from_list(T)}.
16+
reverse_k_chunks(List, K) ->
17+
Groups = reverse_k_chunks(List, K, []),
18+
lists:append(Groups).
19+
reverse_k_chunks([], _K, Acc) -> lists:reverse(Acc);
20+
reverse_k_chunks(List, K, Acc) ->
21+
{Chunk, Rest, Len} = take_chunk(List, K, [], 0),
22+
Group = if Len == K -> Chunk; true -> lists:reverse(Chunk) end,
23+
reverse_k_chunks(Rest, K, [Group | Acc]).
24+
take_chunk(Rest, 0, Chunk, Len) -> {Chunk, Rest, Len};
25+
take_chunk([], _K, Chunk, Len) -> {Chunk, [], Len};
26+
take_chunk([H | T], K, Chunk, Len) -> take_chunk(T, K - 1, [H | Chunk], Len + 1).
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
# Definition for singly-linked list.
2+
#
3+
# defmodule ListNode do
4+
# @type t :: %__MODULE__{
5+
# val: integer,
6+
# next: ListNode.t() | nil
7+
# }
8+
# defstruct val: 0, next: nil
9+
# end
10+
defmodule Solution do
11+
@spec reverse_k_group(head :: ListNode.t | nil, k :: integer) :: ListNode.t | nil
12+
def reverse_k_group(head, k) when k <= 1 or head == nil, do: head
13+
def reverse_k_group(head, k) do
14+
{nodes, rest, count} = take_nodes(head, k, [], 0)
15+
if count < k do
16+
head
17+
else
18+
rest_rev = reverse_k_group(rest, k)
19+
build_reversed(nodes, rest_rev)
20+
end
21+
end
22+
defp take_nodes(node, 0, acc, count), do: {Enum.reverse(acc), node, count}
23+
defp take_nodes(nil, _k, acc, count), do: {Enum.reverse(acc), nil, count}
24+
defp take_nodes(%ListNode{} = node, k, acc, count) do
25+
take_nodes(node.next, k - 1, [node | acc], count + 1)
26+
end
27+
defp build_reversed([], acc), do: acc
28+
defp build_reversed([%ListNode{val: v} | t], acc) do
29+
build_reversed(t, %ListNode{val: v, next: acc})
30+
end
31+
end
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/**
2+
* Definition for singly-linked list.
3+
* type ListNode struct {
4+
* Val int
5+
* Next *ListNode
6+
* }
7+
*/
8+
func reverseKGroup(head *ListNode, k int) *ListNode {
9+
curr := head
10+
count := 0
11+
for curr != nil && count < k {
12+
curr = curr.Next
13+
count++
14+
}
15+
if count == k {
16+
reversedHead := reverseLinkedList(head, k)
17+
head.Next = reverseKGroup(curr, k)
18+
return reversedHead
19+
}
20+
return head
21+
}
22+
func reverseLinkedList(head *ListNode, k int) *ListNode {
23+
var prev *ListNode = nil
24+
curr := head
25+
for k > 0 && curr != nil {
26+
next := curr.Next
27+
curr.Next = prev
28+
prev = curr
29+
curr = next
30+
k--
31+
}
32+
return prev
33+
}

0 commit comments

Comments
 (0)