X-Git-Url: https://git.ralfj.de/rust-101.git/blobdiff_plain/a2eeb1b93e8f52b2119fb11d56f5ffc764ac747b..04e6bfa1aab433e4cfb0058132f7b57258ddcd16:/solutions/src/list.rs?ds=sidebyside diff --git a/solutions/src/list.rs b/solutions/src/list.rs index 180627d..1c794fc 100644 --- a/solutions/src/list.rs +++ b/solutions/src/list.rs @@ -1,4 +1,3 @@ - use std::ptr; use std::mem; use std::marker::PhantomData; @@ -54,6 +53,8 @@ impl LinkedList { if new_last.is_null() { // The list is now empty. self.first = new_last; + } else { + unsafe { (*new_last).next = ptr::null_mut() }; } let last = unsafe { raw_into_box(last) } ; Some(last.data) @@ -87,6 +88,8 @@ impl LinkedList { if new_first.is_null() { // The list is now empty. self.last = new_first; + } else { + unsafe { (*new_first).prev = ptr::null_mut() }; } let first = unsafe { raw_into_box(first) } ; Some(first.data) @@ -102,7 +105,7 @@ impl LinkedList { } } - pub fn iter_mut(&self) -> IterMut { + pub fn iter_mut(&mut self) -> IterMut { IterMut { next: self.first, _marker: PhantomData } } } @@ -201,4 +204,20 @@ mod tests { } assert_eq!(count.count.get(), 20); } + + #[test] + fn test_iter_mut() { + let mut l = LinkedList::::new(); + for i in 0..5 { + l.push_back(i); + } + + assert_eq!(l.pop_front(), Some(0)); + assert_eq!(l.pop_back(), Some(4)); + + for (n, i) in l.iter_mut().enumerate() { + *i-=1; + assert_eq!(n as i32, *i); + } + } }