algorithm - 反转双向链表的子列表

标签 algorithm reverse doubly-linked-list

我最近遇到了一个问题,通过一些阅读,我了解到有一种方法可以在恒定时间内反转双向链表,只需交换头指针和尾指针即可。

现在,考虑问题的一个稍微不同的版本,如果我们只想反转双向链表的子列表(从 x 到 y),该怎么办?

0->1->2->3->4->5->6->7->8->9 其中 (x = 2, y = 7 ) 会成为: 0->1->7->6->5->4->3->2->8->9

最佳答案

你可以,但是你会弄乱链接列表。 基本上,我们向每个节点添加一点,说明此时是否应该颠倒顺序。 接下来,您修改迭代器以异或目前为止看到的所有这些新位。

迭代器现在将根据位的异或选择下一个/上一个或上一个/下一个。

现在您可以在 O(1) 时间内反转链表中的任意间隔,但是您会失去迭代器一致性:任何交换操作都可能使现有迭代器无效。而且代码会非常困惑,所以如果可能的话我会避免它。

要进行实际的翻转,您需要更改(添加空检查以确保不会崩溃)

 (first->prev,last->next) = (last->next, first->prev)
 last->next->next = last
 first->prev->prev = first
 last.reverse_here = !last.reverse_here
 first->prev.reverse_here = !first->prev.reverse_here
 Invalidate_all_existing_iterators()

把它画在纸上,因为它很困惑。

关于algorithm - 反转双向链表的子列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34132185/

相关文章:

algorithm - 与我已经证明的相比,有人可以为我提供更好的冒泡排序证明和场景吗

algorithm - 多分辨率小波分解代码

algorithm - 如果硬件已经做到了,为什么还需要乘法算法?

java - java中双向链表实现的效率

swift - 无法将整个双向链表元素打印到控制台

algorithm - 旅行推销员和寻找最短路径有什么区别?

java - java中如何在Queue前面添加一个元素?

javascript - 使用 splice() 方法反转数组

c - C 中的反向函数产生单词然后产生垃圾

c - 我怎样才能将其转换为双向链表?