链表
链表简介
定义链表结构
use List::*;
enum List {
// Cons: 包含一个元素和一个指向下一个节点的指针的元组结构
Cons(u32, Box<List>),
// Nil: 表示一个链表节点的末端
Nil,
}实现链表的方法
impl List {
// 创建一个空链表
fn new() -> List {
// `Nil` 是 `List`类型的。因为前面我们使用了 `use List::*;`
// 所以不需要 List::Nil 这样使用
Nil
}
// 在前面加一个元素节点,并且链接旧的链表和返回新的链表
fn prepend(self, elem: u32) -> List {
// `Cons` 也是 List 类型的
Cons(elem, Box::new(self))
}
// 返回链表的长度
fn len(&self) -> u32 {
// `self` 的类型是 `&List`, `*self` 的类型是 `List`,
// 匹配一个类型 `T` 好过匹配一个引用 `&T`
match *self {
// 因为`self`是借用的,所以不能转移 tail 的所有权
// 因此使用 tail 的引用
Cons(_, ref tail) => 1 + tail.len(),
// 基本规则:所以空的链表长度都是0
Nil => 0
}
}
// 返回连链表的字符串表达形式
fn stringify(&self) -> String {
match *self {
Cons(head, ref tail) => {
// `format!` 和 `print!` 很像
// 但是返回一个堆上的字符串去替代打印到控制台
format!("{}, {}", head, tail.stringify())
},
Nil => {
format!("Nil")
},
}
}
}代码测试
练习
Last updated