Leetcode中的链表
代码实现
Leetcode中Rust单链表定义如下:
//Definition for singly-linked list.
#[derive(PartialEq, Eq, Clone, Debug)]
pub struct ListNode {
pub val: i32,
pub next: Option<Box<ListNode>>
}
impl ListNode {
#[inline]
fn new(val: i32) -> Self {
ListNode {
next: None,
val
}
}
}
为什么这样设计?
Option用于解决空指针问题。Box而不是引用,用于解决生命周期问题。
设计的缺点
这样的实现,使得之前一些在C语言中简单可行的链表操作,在Rust中较为复杂。
比如由于所有权特性,不能出现两个结点的next指向同一个Option的情况。
比如要将链表A->B->C逆序。
A->B->C => A->B<-C => A<-B<-C
像A->B<-C这种在C语言中常见的状态,在safe的Rust中是不能出现的。
Leetcode.206 反转链表
impl Solution {
pub fn reverse_list(head: Option<Box<ListNode>>) -> Option<Box<ListNode>> {
let mut prev = None; // 上一个节点,改变指向需要mut
let mut cur = head; // 当前节点,改变指向需要mut
while let Some(mut node) = cur{
//使用while let 时, 不可copy的cur必须被处理。
cur = node.next; // 改变cur的指向,
node.next = prev; // 把next指向前一个节点
prev = Some(node); // 更新 prev
}
prev // 跳出循环时,prev是最终的头节点
}
}