mirror of
https://github.com/krahets/hello-algo.git
synced 2025-02-02 14:18:47 +08:00
fix rust linked list (#1609)
This commit is contained in:
parent
2a955f937c
commit
7503a33e8c
@ -21,9 +21,8 @@ fn extend(nums: &[i32], enlarge: usize) -> Vec<i32> {
|
|||||||
// 初始化一个扩展长度后的数组
|
// 初始化一个扩展长度后的数组
|
||||||
let mut res: Vec<i32> = vec![0; nums.len() + enlarge];
|
let mut res: Vec<i32> = vec![0; nums.len() + enlarge];
|
||||||
// 将原数组中的所有元素复制到新
|
// 将原数组中的所有元素复制到新
|
||||||
for i in 0..nums.len() {
|
res[0..nums.len()].copy_from_slice(nums);
|
||||||
res[i] = nums[i];
|
|
||||||
}
|
|
||||||
// 返回扩展后的新数组
|
// 返回扩展后的新数组
|
||||||
res
|
res
|
||||||
}
|
}
|
||||||
@ -54,7 +53,8 @@ fn traverse(nums: &[i32]) {
|
|||||||
_count += nums[i];
|
_count += nums[i];
|
||||||
}
|
}
|
||||||
// 直接遍历数组元素
|
// 直接遍历数组元素
|
||||||
for num in nums {
|
_count = 0;
|
||||||
|
for &num in nums {
|
||||||
_count += num;
|
_count += num;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,9 +19,6 @@ pub fn insert<T>(n0: &Rc<RefCell<ListNode<T>>>, P: Rc<RefCell<ListNode<T>>>) {
|
|||||||
/* 删除链表的节点 n0 之后的首个节点 */
|
/* 删除链表的节点 n0 之后的首个节点 */
|
||||||
#[allow(non_snake_case)]
|
#[allow(non_snake_case)]
|
||||||
pub fn remove<T>(n0: &Rc<RefCell<ListNode<T>>>) {
|
pub fn remove<T>(n0: &Rc<RefCell<ListNode<T>>>) {
|
||||||
if n0.borrow().next.is_none() {
|
|
||||||
return;
|
|
||||||
};
|
|
||||||
// n0 -> P -> n1
|
// n0 -> P -> n1
|
||||||
let P = n0.borrow_mut().next.take();
|
let P = n0.borrow_mut().next.take();
|
||||||
if let Some(node) = P {
|
if let Some(node) = P {
|
||||||
@ -31,26 +28,39 @@ pub fn remove<T>(n0: &Rc<RefCell<ListNode<T>>>) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* 访问链表中索引为 index 的节点 */
|
/* 访问链表中索引为 index 的节点 */
|
||||||
pub fn access<T>(head: Rc<RefCell<ListNode<T>>>, index: i32) -> Rc<RefCell<ListNode<T>>> {
|
pub fn access<T>(head: Rc<RefCell<ListNode<T>>>, index: i32) -> Option<Rc<RefCell<ListNode<T>>>> {
|
||||||
if index <= 0 {
|
fn dfs<T>(
|
||||||
return head;
|
head: Option<&Rc<RefCell<ListNode<T>>>>,
|
||||||
};
|
index: i32,
|
||||||
if let Some(node) = &head.borrow().next {
|
) -> Option<Rc<RefCell<ListNode<T>>>> {
|
||||||
return access(node.clone(), index - 1);
|
if index <= 0 {
|
||||||
|
return head.cloned();
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some(node) = head {
|
||||||
|
dfs(node.borrow().next.as_ref(), index - 1)
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return head;
|
dfs(Some(head).as_ref(), index)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 在链表中查找值为 target 的首个节点 */
|
/* 在链表中查找值为 target 的首个节点 */
|
||||||
pub fn find<T: PartialEq>(head: Rc<RefCell<ListNode<T>>>, target: T, index: i32) -> i32 {
|
pub fn find<T: PartialEq>(head: Rc<RefCell<ListNode<T>>>, target: T) -> i32 {
|
||||||
if head.borrow().val == target {
|
fn find<T: PartialEq>(head: Option<&Rc<RefCell<ListNode<T>>>>, target: T, idx: i32) -> i32 {
|
||||||
return index;
|
if let Some(node) = head {
|
||||||
};
|
if node.borrow().val == target {
|
||||||
if let Some(node) = &head.borrow_mut().next {
|
return idx;
|
||||||
return find(node.clone(), target, index + 1);
|
}
|
||||||
|
return find(node.borrow().next.as_ref(), target, idx + 1);
|
||||||
|
} else {
|
||||||
|
-1
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return -1;
|
|
||||||
|
find(Some(head).as_ref(), target, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Driver Code */
|
/* Driver Code */
|
||||||
@ -82,9 +92,9 @@ fn main() {
|
|||||||
|
|
||||||
/* 访问节点 */
|
/* 访问节点 */
|
||||||
let node = access(n0.clone(), 3);
|
let node = access(n0.clone(), 3);
|
||||||
println!("链表中索引 3 处的节点的值 = {}", node.borrow().val);
|
println!("链表中索引 3 处的节点的值 = {}", node.unwrap().borrow().val);
|
||||||
|
|
||||||
/* 查找节点 */
|
/* 查找节点 */
|
||||||
let index = find(n0.clone(), 2, 0);
|
let index = find(n0.clone(), 2);
|
||||||
println!("链表中值为 2 的节点的索引 = {}", index);
|
println!("链表中值为 2 的节点的索引 = {}", index);
|
||||||
}
|
}
|
||||||
|
@ -10,9 +10,15 @@ pub struct Vertex {
|
|||||||
pub val: i32,
|
pub val: i32,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl From<i32> for Vertex {
|
||||||
|
fn from(value: i32) -> Self {
|
||||||
|
Self { val: value }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* 输入值列表 vals ,返回顶点列表 vets */
|
/* 输入值列表 vals ,返回顶点列表 vets */
|
||||||
pub fn vals_to_vets(vals: Vec<i32>) -> Vec<Vertex> {
|
pub fn vals_to_vets(vals: Vec<i32>) -> Vec<Vertex> {
|
||||||
vals.into_iter().map(|val| Vertex { val }).collect()
|
vals.into_iter().map(|val| val.into()).collect()
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 输入顶点列表 vets ,返回值列表 vals */
|
/* 输入顶点列表 vets ,返回值列表 vals */
|
||||||
|
Loading…
Reference in New Issue
Block a user