我正在尝试使用简单的链接列表:
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。
答案 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个指针写入是最低限度的。