-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathreverse_linked_list.rs
More file actions
48 lines (41 loc) · 1.58 KB
/
reverse_linked_list.rs
File metadata and controls
48 lines (41 loc) · 1.58 KB
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
use utils::listnode::{LinkedListToVec, ListNode, VecToLinkedList};
pub struct Solution;
impl Solution {
pub fn reverse_list(head: Option<Box<ListNode<i32>>>) -> Option<Box<ListNode<i32>>> {
let vec = head.to_vector();
let rev_vec: Vec<i32> = vec.into_iter().rev().collect();
rev_vec.to_linked_list()
}
pub fn reverse_list_three_pointer(
head: Option<Box<ListNode<i32>>>,
) -> Option<Box<ListNode<i32>>> {
let mut prev: Option<Box<ListNode<i32>>> = None;
let mut curr = head;
while let Some(mut current_node) = curr {
let next_temp = current_node.next.take();
current_node.next = prev;
prev = Some(current_node);
curr = next_temp;
}
prev
}
pub fn reverse_list_recursive(head: Option<Box<ListNode<i32>>>) -> Option<Box<ListNode<i32>>> {
fn helper(
node: Option<Box<ListNode<i32>>>,
prev: Option<Box<ListNode<i32>>>,
) -> Option<Box<ListNode<i32>>> {
match node {
None => prev,
Some(mut current_node) => {
let next_temp = current_node.next.take();
current_node.next = prev;
helper(next_temp, Some(current_node))
} // Some(mut current_node) => helper(
// std::mem::replace(&mut current_node.next, prev), // posso usar um mem::replace aqui para trocar os valores
// Some(current_node),
// ),
}
}
helper(head, None)
}
}