Linked List
Linked List
ptr::NonNull};
struct Node<T> {
value: T,
next: Option<NonNull<Node<T>>>,
previous: Option<NonNull<Node<T>>>,
}
impl<T> Node<T> {
fn new(value: T) -> NonNull<Node<T>> {
let layout: Layout = Layout::new::<Node<T>>();
(*ptr).value = value;
(*ptr).next = None;
(*ptr).previous = None;
unsafe {
// TODO: Implement 'Result' and use it
(*next.as_ptr()).previous =
Some(NonNull::<Node<T>>::new(self).unwrap());
}
}
}
if self.size == 0 {
self.root = Some(node);
self.size += 1;
return;
}
match self.last {
Some(last) => {
unsafe {
(*last.as_ptr()).next = Some(node);
(*node.as_ptr()).previous = Some(last);
}
self.size += 1;
},
None => panic!("TODO: Implement proper error management"),
}
}
match self.size {
0 => {
iterator.value = None;
},
1 => {
self.root = None;
self.last = None;
self.size = 0;
iterator.value = None;
},
_ => {
unsafe {
// TODO: Manage if the 'unwrap' fails
(*(*node).previous.unwrap().as_ptr()).next = (*node).next;
self.size -= 1;
iterator.value = (*node).next;
return iterator;
}