题目
给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。
返回删除后的链表的头节点。
示例1:
1 | 输入: head = [4,5,1,9], val = 5 |
示例2:
1 | 输入: head = [4,5,1,9], val = 1 |
解题
说明
这道题目如果用 c
或者 c++
做非常简单
但是如果能用 Rust
实现且不使用unsafe模式
其实需要对 Rust
的指针、引用以及所有权机制有相对深刻的理解才行
个人首次尝试用
Rust
实现失败了,所以记录一下,深刻学习。
代码
1 | // Definition for singly-linked list. |
代码实现很短,但是却非常精练,值得学习和深思。
关键点【1】,需要思考:变量
hp
是什么类型?
因为take()
方法至少需要mut
才能调用,所以这里的hp
类型应该是&mut Box<ListNode>
类型
关键点【2】,需要思考:
hcal: &mut Option<T>
作为一个指针/引用,它的解引用运算符此时表示的什么含义?
从结果来看,这里*hcal
表示了指向当前节点的指针,也就是上一个节点的next
关键点【3】,需要思考:为什么这里要从类型
&mut Option<T>
到Option<&mut T>
的转化?
TODO
综上,理解这道题解法的关键就是:变量 hcal
是每一个节点中 next
字段的引用!!!