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