use std::collections::LinkedList; fn main() { let mut list = LinkedList::<String>::new(); // Looking for something like insert(value, index) }
我想要一个在给定索引处插入给定值的函数
xam8gpfp1#
如果你想在某个位置(索引)插入一个元素,那么你很可能使用了错误的数据结构。唯一的方法是从头开始迭代并计算元素的数量。然而,这可能会对性能产生负面影响,可能与将元素插入Vec类似。使用链表的主要好处是快速插入/删除元素。但是如果你需要遍历许多元素来找到某个位置,那可能会比插入本身花费更多的时间。使用向量,插入(不是在末尾追加)会更慢,但是通过索引查找元素是一个即时操作(不需要 * 遍历 * 元素来到达那里)。
Vec
vlju58qv2#
关于插入到LinkedList中是否是一个好主意的讨论,请参见at54321的回答(可能不是)。现在,如果你确定要执行该操作,你可以通过组合LinkedList::split_off,LinkedList::push_back和LinkedList::append方法来自己编写它:
LinkedList
LinkedList::split_off
LinkedList::push_back
LinkedList::append
use std::collections::LinkedList; fn insert_at(l: &mut LinkedList<u8>, idx: usize, val: u8) { let mut tail = l.split_off(idx); l.push_back(val); l.append(&mut tail); } fn main(){ let mut l = LinkedList::from([1, 2, 3]); insert_at(&mut l, 2, 4); let res: Vec<u8> = l.into_iter().collect(); assert_eq!(res, vec![1, 2, 4, 3]); }
Playground.
2条答案
按热度按时间xam8gpfp1#
如果你想在某个位置(索引)插入一个元素,那么你很可能使用了错误的数据结构。
唯一的方法是从头开始迭代并计算元素的数量。然而,这可能会对性能产生负面影响,可能与将元素插入
Vec
类似。使用链表的主要好处是快速插入/删除元素。但是如果你需要遍历许多元素来找到某个位置,那可能会比插入本身花费更多的时间。使用向量,插入(不是在末尾追加)会更慢,但是通过索引查找元素是一个即时操作(不需要 * 遍历 * 元素来到达那里)。
vlju58qv2#
关于插入到
LinkedList
中是否是一个好主意的讨论,请参见at54321的回答(可能不是)。现在,如果你确定要执行该操作,你可以通过组合
LinkedList::split_off
,LinkedList::push_back
和LinkedList::append
方法来自己编写它:Playground.