571
社区成员
发帖
与我相关
我的任务
分享结构体定义
#[derive(Debug)]
struct LinkedList<T> {
head: Link<T>,
tail: Link<T>,
}
type Link<T> = Option<Rc<RefCell<Node<T>>>>;
#[derive(Debug)]
struct Node<T> {
elem: T,
next: Link<T>,
}
实例
fn new() -> Self {
LinkedList {
head: None,
tail: None,
}
}
迭代器
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 into_iter(self) -> IntoIter<T> {
IntoIter(self)
}
后插
fn push(&mut self, elem: T) {
let new_point = Rc::new(RefCell::new(Node {
elem,
next: self.head.take()
}));
if self.tail.is_none() {
self.tail = Some(Rc::clone(&new_point));
}
self.head = Some(new_point);
}
头结点
fn peek_node(&self) -> Option<Ref<Node<T>>> {
self.head.as_ref().map(|r| r.borrow())
}
fn peek(&self) -> Option<Ref<T>> {
self.head.as_ref().map(|r| Ref::map(
r.borrow(), |node| &node.elem
))
}
弹出
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 pop(&mut self) -> Option<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.map(|r| Rc::try_unwrap(r).ok().unwrap().into_inner().elem)
}
学号:166