Untitled
unknown
rust
a year ago
2.2 kB
10
Indexable
#![allow(dead_code)] use std::cell::RefCell; use std::rc::Rc; fn main() { let input = vec![1, 2, 3, 4, 5]; let head = Node::from_vec(input); let cur = head.as_ref().unwrap().clone(); let mut cur = Some(cur); while cur.is_some() { println!("{}", cur.as_ref().unwrap().borrow().val); let cur_temp = cur.as_ref().unwrap().borrow().next.clone(); cur = cur_temp; } let output = reverse_linked_list(head); let cur = output.as_ref().unwrap().clone(); let mut cur = Some(cur); while cur.is_some() { println!("{}", cur.as_ref().unwrap().borrow().val); let cur_temp = cur.as_ref().unwrap().borrow().next.clone(); cur = cur_temp; } } fn reverse_linked_list<T>(head: WrappedNode<T>) -> WrappedNode<T> where T: Default, { let mut prev: WrappedNode<T> = None; let cur = head.as_ref().unwrap().clone(); let mut cur = Some(cur); while cur.is_some() { let temp = cur.as_ref().unwrap().borrow().next.clone(); cur.as_ref().unwrap().borrow_mut().next = prev; prev = cur.clone(); cur = temp; } prev } type WrappedNode<T> = Option<Rc<RefCell<Node<T>>>>; #[derive(Default)] struct Node<T> where T: Default, { pub val: T, pub next: WrappedNode<T>, } impl<T> Node<T> where T: Default, { pub fn new(val: T) -> Self { Node { val, next: None } } pub fn append(&mut self, node: WrappedNode<T>) -> Result<(), &'static str> { if self.next.is_some() { return Err("This node already has a next"); } self.next = node; Ok(()) } pub fn from_vec(arr: Vec<T>) -> WrappedNode<T> { let parking = Node::<T>::default(); let parking = Rc::new(RefCell::new(parking)); let mut cur = parking.clone(); for item in arr { let next = Some(Rc::new(RefCell::new(Node::new(item)))); cur.borrow_mut().next = next; let temp_next = cur.borrow().next.as_ref().unwrap().clone(); cur = temp_next; } let next = parking.borrow().next.as_ref().unwrap().clone(); Some(next) } }
Editor is loading...
Leave a Comment