https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=693594655ea355b40e2175542c653879
我想用peek()
删除列表的最后一个元素,返回data
。
type Link<T> = Option<Box<Node<T>>>;
struct Node<T> {
pub data: T,
pub next: Link<T>,
}
struct List<T> {
pub head: Link<T>,
}
impl<T> List<T> {
fn peek(&mut self) -> Option<T> {
let mut node = &self.head;
while let Some(cur_node) = &mut node {
if cur_node.next.is_some() {
node = &cur_node.next;
continue;
}
}
let last = node.unwrap();
let last = last.data;
return Some(last);
}
}
#[test]
fn peek_test() {
let mut q = List::new();
q.push(1);
q.push(2);
q.push(3);
assert_eq!(q.empty(), false);
assert_eq!(q.peek().unwrap(), 1);
assert_eq!(q.peek().unwrap(), 2);
assert_eq!(q.peek().unwrap(), 3);
assert_eq!(q.empty(), true);
}
为了保存head
,我需要通过引用访问元素,但是这个问题并不适合我,我查看了“too-many-lists”,但是值只是通过引用返回,我想删除tail元素。
2条答案
按热度按时间kqlmhetl1#
要实现这一点,必须从接受共享引用(
&
)切换到接受可变引用。这会导致代码中的借用检查器错误,这就是为什么我必须将
while let
循环更改为检查下一个元素是否为Some
的循环,然后才能以可变方式借用节点的内容并推进它。最后,我
Option::take
最后一个元素并返回它的数据,我使用Option::map
来避免使用unwrap
,它会因为空列表而崩溃,如果你想保留你的变量,你应该用try操作符?
替换unwrap
。简而言之,您可以像这样实现
pop_back
:wtzytmuj2#
我建议像下面这样的东西,只是因为我花了时间在上面。-)