#linked-list #list #node-key

key-node-list

存储键-节点对的循环链表

5 个版本

0.0.5 2023 年 1 月 12 日
0.0.4 2022 年 1 月 9 日
0.0.3 2022 年 1 月 5 日
0.0.2 2021 年 12 月 24 日
0.0.1 2021 年 12 月 22 日

#1315数据结构

Download history 83/week @ 2024-03-11 85/week @ 2024-03-18 250/week @ 2024-03-25 256/week @ 2024-04-01 302/week @ 2024-04-08 374/week @ 2024-04-15 311/week @ 2024-04-22 237/week @ 2024-04-29 245/week @ 2024-05-06 263/week @ 2024-05-13 196/week @ 2024-05-20 342/week @ 2024-05-27 543/week @ 2024-06-03 173/week @ 2024-06-10 208/week @ 2024-06-17 69/week @ 2024-06-24

1,056 每月下载量
用于 2 crates

GPL-3.0 许可证

53KB
1K SLoC

key-node-list

github crates.io docs.rs build status

存储键-节点对的循环链表。

KeyNodeList 是一个循环链表,它使用哈希表来维护键和节点之间的对应关系,并在节点本身中记录当前节点的上一个键和下一个键。在此过程中没有指针操作,因此 key_node_list 完全在安全 Rust 中实现。

您可以在 KeyNodeList 中完成键查找、键-节点对更新、键-节点对删除等操作,这些操作的时间复杂度为 O(1)。您还可以使用基于游标的接口来遍历或编辑链表。

用法

key_node_list 可在 crates.io 上找到:

cargo add key-node-list

示例

use key_node_list::KeyValueList;

// construct key-value list from tuple array
let mut list = KeyValueList::from([(1, "Reimu"), (2, "Marisa")]);

// or pushing other key-value pairs to the front/back of list
list.push_front(0, "Alice").unwrap();
list.push_back(3, "Patchouli").unwrap();

// query nodes by key
assert_eq!(list[&1].value(), &"Reimu");
assert_eq!(list[&0].value(), &"Alice");

// also you can update nodes by key
*list.node_mut(&3).unwrap().value_mut() = "Youmu";
*list.front_node_mut().unwrap().value_mut() = "Mokou";
assert_eq!(list[&3].value(), &"Youmu");
assert_eq!(list[&0].value(), &"Mokou");
assert_eq!(list.front_node().unwrap().value(), &"Mokou");

// remove some key-node pairs
assert!(list.pop_front().is_some());
assert!(list.remove(&2).is_some());

// all key-node pairs are in order
list.push_back(5, "Yuyuko");
let vec: Vec<_> = list.into_iter().map(|(k, n)| (k, n.into_value())).collect();
assert_eq!(vec, [(1, "Reimu"), (3, "Youmu"), (5, "Yuyuko")]);

有关更多详细信息,请访问 key_node_list 在 docs.rs

变更日志

查看 CHANGELOG.md

许可证

版权所有 (C) 2010-2023 MaxXing。许可证 GPLv3。

无运行时依赖