更改链接列表中元素的顺序

时间:2010-11-23 09:40:55

标签: 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。

1 个答案:

答案 0 :(得分:1)

一般来说很难说。您似乎想要在元素1之后移动元素4.您是否同时拥有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个指针写入是最低限度的。