c++ - 更改链表中元素的顺序

标签 c++

我正在尝试使用简单的链表:

struct index
{
   struct index* next_element;
   int data;
   struct index* previous_element;
} 

在性能方面更改元素顺序的最佳方法是什么? 例如,我有 1 2 3 4 5 6 7 8,我需要 1 4 2 3 5 6 7 8。

最佳答案

一般情况下很难说。似乎您想将元素 4 移动到元素 1 之后。您是否有两者的 index*?或者你只知道第四个元素必须移动两个位置?这显然会影响您必须执行的列表遍历的数量。

通常,为了获得最大效率,您需要一个函数

void list_remove_unsafe_(index* i) {
  // These two have to change (minimum needed)
  i->previous_element->next_element = i->next_element;
  i->next_element->previous_element-> = i->previous_element;
  // We leave i itself unchanged (dangling)
}

和后续行动

void list_insert_unsafe_(index* after, index* i) {
  // These four have to change (minimum needed)
  index* before = after->next_element;
  i->previous_element = after;
  i->next_element = before;
  before->previous_element = i;
  after->next_element = i;
}

这些操作是不安全的,因为它们暂时使列表处于损坏状态并做出很多假设(例如,不检查列表的开始/结束)。那些需要特殊处理。对于基本操作,这 6 次指针写入是最低限度。

关于c++ - 更改链表中元素的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4254609/

相关文章:

c++ - 字符串/wchar 内容不一致取决于代码的位置?

c++ - 添加可绘制对象层以将逻辑与图形分开

c++ - 结构和位域成员排序

c++ - 重载运算符(operator) body 的奥秘

c++ STL __declspec(noreturn) 无效编译错误

c++ - what(): std::bad_alloc - 我的内存力不足了吗?

C++ 静态数组

c++ - 串联加入 3 个 C++ 程序

c++ - 通过缓存元函数优化编译时性能

c++ - 有没有办法只释放 C\C++ 中动态分配的数组的一部分(缩小现有数组)?