rt_lists/
second.rs

1use std::mem;
2
3type Link = Option<Box<Node>>;
4
5#[allow(dead_code)]
6struct Node {
7  elem: i32,
8  next: Link,
9}
10
11pub struct List {
12  head: Link,
13}
14
15impl List {
16  pub fn new() -> Self {
17    List { head: None }
18  }
19
20  pub fn push(&mut self, elem: i32) {
21    let new_node = Box::new(Node {
22      elem: elem,
23      next: self.head.take(),
24    });
25    self.head = Some(new_node);
26  }
27
28  pub fn pop(&mut self) -> Option<i32> {
29    match mem::replace(&mut self.head, None) {
30      None => None,
31      Some(node) => {
32        self.head = node.next;
33        Some(node.elem)
34      }
35    }
36  }
37
38  pub fn peek(&self) -> Option<i32> {
39    match &self.head {
40      None => None,
41      Some(node) => {
42        Some(node.elem)
43      }
44    }
45  }
46}
47
48impl Drop for List {
49  fn drop(&mut self) {
50    let mut cur_link = self.head.take();
51    while let Some(mut boxed_node) = cur_link {
52      cur_link = boxed_node.next.take();
53    }
54  }
55}
56