C 如何交换列表中的元素?
我正在努力学习自己的数据结构和算法。我用C写了我自己的双链表,现在我想写一些算法在这个链表上执行。交换列表项的首选方式是什么?交换内容还是重新排列指向下一个和上一个列表项的指针更好 重新排列指针。交换数据项可能会产生副作用。特别是,您可能已将对某个节点的引用存储在函数之外的某个位置,并且通常在重新排列列表中节点的顺序时,您不希望持有对某个节点的引用的人突然发现该节点指向新数据。这是因为通常节点的重要标识特征是它指向的数据,而不是它在列表中的位置。规范交换是通过指针重新排列完成的,没有副作用,当然更快:C 如何交换列表中的元素?,c,algorithm,data-structures,C,Algorithm,Data Structures,我正在努力学习自己的数据结构和算法。我用C写了我自己的双链表,现在我想写一些算法在这个链表上执行。交换列表项的首选方式是什么?交换内容还是重新排列指向下一个和上一个列表项的指针更好 重新排列指针。交换数据项可能会产生副作用。特别是,您可能已将对某个节点的引用存储在函数之外的某个位置,并且通常在重新排列列表中节点的顺序时,您不希望持有对某个节点的引用的人突然发现该节点指向新数据。这是因为通常节点的重要标识特征是它指向的数据,而不是它在列表中的位置。规范交换是通过指针重新排列完成的,没有副作用,当然
void swap (node *a, node *b) {
node *tmp;
tmp = a;
a = b;
b = tmp;
}
根据存储在链表元素中的内容的类型,交换元素的实际内容将是一件棘手的事情(例如,考虑不同长度字符串的链表)因此,交换指向下一个和上一个列表项的指针更容易。取决于您如何分配内容
如果您正在存储指向内容的指针,那么切换内容并不是什么大问题。如果节点中有一个大的结构,那么切换指针可能比复制整个内容更有效。我倾向于支持大多数人已经说过的话。一点背景知识可能会有所帮助:交换指针可以保证工作,而交换对象可能并不总是像看上去那么简单。想想可能会被创建的临时性的(和我的意思是一般的,而不是C++语言的特征方式)会发生,实际上把容器(列表)放在一个不希望的状态。在容器中寻找不变量——即交换应该保持列表大小不变,元素不变,并在其上进行设计 交换内容还是重新排列指向下一个和上一个列表项的指针更好 重新排列指针,因为交换节点的所有元素可能要昂贵得多 就时间复杂度而言,交换两个指针是恒定的操作 但是,如果要在两个节点之间交换所有元素,则需要访问所有元素,并将它们与对应的元素交换,即O(f),其中f是表示节点的结构具有的字段数(即节点具有的数据数) 换句话说,交换节点数据是一种线性操作,而交换两个指针是恒定的
交换数据可能会产生副作用,特别是当您可能在函数之外的某个位置存储了对节点的引用时,这已经包含在accepted中,但我也想指出这一事实 …但如果每个节点都知道其在链表中的位置,则这些位置不会随此交换而更改。如果每个节点都知道其位置,则可以轻松添加几行来更改这些位置。呃。。。这个代码到底应该做什么?它在一个函数中交换两个本地端口。该函数没有外部影响。重点是什么?我相信。很好的观察,这很有道理。非常感谢。