1 改类型声明

  1. pub struct List<T> {
  2. head: Link<T>,
  3. }
  4. type Link<T> = Option<Box<Node<T>>>;
  5. struct Node<T> {
  6. elem: T,
  7. next: Link<T>,
  8. }

2 修改类型实现

  1. impl<T> List<T> {
  2. pub fn new() -> Self {
  3. List { head: None }
  4. }
  5. pub fn push(&mut self, val: T) {
  6. let node = Node {
  7. elem: val,
  8. next: self.head.take(),
  9. };
  10. self.head = Some(Box::new(node));
  11. }
  12. pub fn pop(&mut self) -> Option<T> {
  13. // 使用 Option::map()
  14. // 注意: map() 要求所有权;node 的类型是 Box<Node>
  15. self.head.take().map(|node| {
  16. self.head = node.next;
  17. node.elem
  18. })
  19. }
  20. }
  21. impl<T> Drop for List<T> {
  22. fn drop(&mut self) {
  23. let mut cur_link = self.head.take();
  24. while let Some(mut boxed_node) = cur_link {
  25. cur_link = boxed_node.next.take();
  26. }
  27. }
  28. }