|
|
@@ -70,6 +70,26 @@ impl<T> Iterator for IntoIter<T> {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+pub struct Iter<'a, T> {
|
|
|
+ next: Option<&'a Node<T>>,
|
|
|
+}
|
|
|
+impl<T> List<T> {
|
|
|
+ pub fn iter<'a>(&'a self) -> Iter<'a, T> {
|
|
|
+ Iter {
|
|
|
+ next: self.head.as_deref(),
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+impl<'a, T> Iterator for Iter<'a, T> {
|
|
|
+ type Item = &'a T;
|
|
|
+ fn next(&mut self) -> Option<Self::Item> {
|
|
|
+ self.next.map(|node| {
|
|
|
+ self.next = node.next.as_deref();
|
|
|
+ &node.elem
|
|
|
+ })
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
#[cfg(test)]
|
|
|
mod test {
|
|
|
use super::List;
|
|
|
@@ -134,4 +154,17 @@ mod test {
|
|
|
assert_eq!(iter.next(), Some(1));
|
|
|
assert_eq!(iter.next(), None);
|
|
|
}
|
|
|
+
|
|
|
+ #[test]
|
|
|
+ fn iter() {
|
|
|
+ let mut list = List::new();
|
|
|
+ list.push(1);
|
|
|
+ list.push(2);
|
|
|
+ list.push(3);
|
|
|
+
|
|
|
+ let mut iter = list.iter();
|
|
|
+ assert_eq!(iter.next(), Some(3).as_ref());
|
|
|
+ assert_eq!(iter.next(), Some(2).as_ref());
|
|
|
+ assert_eq!(iter.next(), Some(1).as_ref());
|
|
|
+ }
|
|
|
}
|