571
社区成员
发帖
与我相关
我的任务
分享
//定义节点
#[derive(Debug)]
struct Node<T> {
elem: T,
next: Link<T>,
}
//定义链表
#[derive(Debug)]
struct LinkedList<T> {
head: Link<T>,
tail: Link<T>,
}
type Link<T> = Option<Rc<RefCell<Node<T>>>>;
相关API设计
//链表的初始化,初始化一个空的链表
impl<T> LinkedList<T> {
fn new() -> Self {
LinkedList {
head: None,
tail: None,
}
}
}
//向链表中添加新的节点
fn push(&mut self, elem: T) {
let new_point = Rc::new(Node {
elem,
next: self.head.take()
});
// self.head = Some(new_point);
if self.tail.is_none() {
self.tail = Some(Rc::clone(&new_point));
// self.tail = self.head.as_ref().map(|s| Rc::clone(s))
}
self.head = Some(new_point);
}
//删除节点
type Link<T> = Option<Rc<RefCell<Node<T>>>>;
fn pop_link(&mut self) -> Link<T> {
let first_link = self.head.take();
let next_link = match first_link {
Some(ref x) => x.borrow_mut().next.take(),
None => None
};
self.head = next_link;
if self.head.is_none() {
self.tail.take();
}
first_link
}
//查看链表中头结点内容
fn peek_mut(&mut self) -> Option<RefMut<T>> {
self.head.as_ref().map(|r| RefMut::map(
r.borrow_mut(), |node| &mut node.elem
))
}
//对链表的遍历,使用Iterator
pub trait Iterator {
type Item;
fn next(&mut self) -> Option<Self::Item>;
}
struct IntoIter<T>(LinkedList<T>);
impl<T> Iterator for IntoIter<T> {
type Item = T;
fn next(&mut self) -> Option<Self::Item> {
self.0.pop()
}
}
测试代码
fn main() {
let mut list: LinkedList<u32> = LinkedList::new();
list.push(1);
list.push(2);
list.push(3);
list.push(4);
*list.peek_mut().unwrap() = 5;
println!("peek: {:?}\n", list.peek().unwrap());
println!("pop: {:?}\n", list.pop());
let mut iter = list.into_iter();
println!("next: {:?}\n", iter.next());
println!("next: {:?}\n", iter.next());
println!("next: {:?}\n", iter.next());
println!("next: {:?}\n", iter.next());
}
测试结果:

将代码push至Gitee


库链接:https://gitee.com/liu-xuanliang1/trust-build-linktable
学号:323