代码之家  ›  专栏  ›  技术社区  ›  Lucas

如何交换列表中的元素?

  •  2
  • Lucas  · 技术社区  · 15 年前

    我正在尝试自己学习数据结构和算法。我用C语言编写了自己的双链表,现在我想在这个列表上编写一些算法。交换列表项的首选方法是什么?交换内容还是重新排列指向下一个和上一个列表项的指针更好?

    5 回复  |  直到 15 年前
        1
  •  9
  •   JSBÕ±Õ¸Õ£Õ¹    15 年前

    重新排列指针。交换数据项可能会产生副作用。尤其是,您可能在函数之外的某个位置存储了对节点的引用,并且 通常 当您重新排列列表中节点的顺序时,您不希望持有对节点的引用的人突然发现节点指向新数据。这是因为通常,节点的重要特征是它指向的数据 它在列表中的位置。

        2
  •  0
  •   Vinko Vrsalovic    15 年前

    标准交换是通过指针重新排列完成的,没有副作用,当然速度更快:

    void swap (node *a, node *b) {
        node *tmp;
    
        tmp = a;
        a = b;
        b = tmp;
    }
    
        3
  •  0
  •   Justin Niessner    15 年前

    根据存储在链接列表元素中的内容的类型,交换元素的实际内容是很困难的(例如,考虑不同长度字符串的链接列表),因此更容易交换指向下一个和上一个列表项的指针。

        4
  •  0
  •   John    15 年前

    取决于您如何分配内容。

    如果您正在存储指向内容的指针,那么切换内容就没什么大不了的了。如果您的节点中有一个大型结构,那么切换指针可能比复制整个内容更有效。

        5
  •  0
  •   dirkgently    15 年前

    我倾向于站在大多数人已经说过的一边。一点背景可能会有所帮助:交换指针是可以保证工作的,而交换对象可能并不总是看起来那么简单。想想可能会创建的时间段,而异常(我的意思是一般的,而不是C++语言特性的方式)可能会发生,实际上把容器(列表)放在一个不希望的状态。在容器中寻找不变量——这意味着交换应该使列表大小保持不变,并且元素保持不变并在其上进行设计。