如何将元素插入rust中std::collections::LinkedList库的LinkedList中

enyaitl3  于 2023-04-12  发布在  其他
关注(0)|答案(2)|浏览(146)
use std::collections::LinkedList;

fn main() {
  let mut list = LinkedList::<String>::new();
  
  // Looking for something like insert(value, index)

}

我想要一个在给定索引处插入给定值的函数

xam8gpfp

xam8gpfp1#

如果你想在某个位置(索引)插入一个元素,那么你很可能使用了错误的数据结构。
唯一的方法是从头开始迭代并计算元素的数量。然而,这可能会对性能产生负面影响,可能与将元素插入Vec类似。
使用链表的主要好处是快速插入/删除元素。但是如果你需要遍历许多元素来找到某个位置,那可能会比插入本身花费更多的时间。使用向量,插入(不是在末尾追加)会更慢,但是通过索引查找元素是一个即时操作(不需要 * 遍历 * 元素来到达那里)。

vlju58qv

vlju58qv2#

关于插入到LinkedList中是否是一个好主意的讨论,请参见at54321的回答(可能不是)。
现在,如果你确定要执行该操作,你可以通过组合LinkedList::split_offLinkedList::push_backLinkedList::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.

相关问题