Rust-实现链表

这篇笔记探讨了在Rust中实现单链表的复杂性,特别是所有权、生命周期和借用的概念。强调了在头部插入元素时,由于Rust的唯一可变引用规则,不能像C语言那样操作,而需要利用Rust的特性来解决这一问题。
摘要由CSDN通过智能技术生成

简介

实现单链表在别的语言里面可能是一件简单的事情,单对于Rust来说,绝对不简单。只有熟悉了Rust特有的所有权机制、生命周期和借用等概念才能实现出一个像样的单链表。

这篇笔记不会一步步教你如何用Rust写一个单链表,因为这样的教程已经有人写了,并且写得很好。这里只记录一下使用Rust实现单链表时的一些注意事项,以及一些笔记。

注意事项

只有一个可变引用

在C里面,如果要在链表的头部插入元素,可以这样写

Node* new_node = create_new_node(v);
new_node->next = head;
head = new_node;
好的,以下是用 Rust 实现双向链表的代码: ```rust use std::rc::Rc; use std::cell::RefCell; struct Node<T> { value: T, prev: Option<Rc<RefCell<Node<T>>>>, next: Option<Rc<RefCell<Node<T>>>>, } impl<T> Node<T> { fn new(value: T) -> Rc<RefCell<Self>> { Rc::new(RefCell::new(Node { value, prev: None, next: None, })) } } pub struct LinkedList<T> { head: Option<Rc<RefCell<Node<T>>>>, tail: Option<Rc<RefCell<Node<T>>>>, len: usize, } impl<T> LinkedList<T> { pub fn new() -> Self { LinkedList { head: None, tail: None, len: 0, } } pub fn push_front(&mut self, value: T) { let new_node = Node::new(value); match self.head.take() { Some(old_head) => { old_head.borrow_mut().prev = Some(new_node.clone()); new_node.borrow_mut().next = Some(old_head); self.head = Some(new_node); } None => { self.head = Some(new_node.clone()); self.tail = Some(new_node); } } self.len += 1; } pub fn push_back(&mut self, value: T) { let new_node = Node::new(value); match self.tail.take() { Some(old_tail) => { old_tail.borrow_mut().next = Some(new_node.clone()); new_node.borrow_mut().prev = Some(old_tail); self.tail = Some(new_node); } None => { self.head = Some(new_node.clone()); self.tail = Some(new_node); } } self.len += 1; } pub fn pop_front(&mut self) -> Option<T> { self.head.take().map(|old_head| { match old_head.borrow_mut().next.take() { Some(new_head) => { new_head.borrow_mut().prev = None; self.head = Some(new_head); } None => { self.tail = None; } } self.len -= 1; Rc::try_unwrap(old_head).ok().unwrap().into_inner().value }) } pub fn pop_back(&mut self) -> Option<T> { self.tail.take().map(|old_tail| { match old_tail.borrow_mut().prev.take() { Some(new_tail) => { new_tail.borrow_mut().next = None; self.tail = Some(new_tail); } None => { self.head = None; } } self.len -= 1; Rc::try_unwrap(old_tail).ok().unwrap().into_inner().value }) } pub fn len(&self) -> usize { self.len } } ``` 希望这个代码对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值