我有一个循环链表,长这样:
4 -> 3 -> 2 -> 5 -> 0 -> 1 -> 开始
我想把这个链表分成两个部分,反转其中一个部分,然后重新连接。类似这样:
分割,O(1) 操作 4 ** 3 -> 2 -> 5 ** 0 -> 1 -> 开始
反转,O(n) 操作 0 ** 3 -> 2 -> 5 ** 4 -> 1 -> 开始
重新连接,O(1) 操作 0 -> 3 -> 2 -> 5 -> 4 -> 1 -> 开始
STL似乎没有循环链表,但我希望可以用(forward) list表示列表。这需要: * 将列表拆分为子列表的方法 * 合并列表的方法
使用std::list::splice合并子列表应该很容易,并且应该是O(1)操作。太好了!
然而,我找不到一个好的O(1)方法来将列表拆分为子列表。一种方法是使用迭代器,但我认为在我的情况下不适用,因为子列表在列表的末尾结束,并在列表的开头继续。
有没有有效的方法使用STL实现此算法?还是我应该放弃并编写自己的循环链表库?
谢谢!
4 -> 3 -> 2 -> 5 -> 0 -> 1 -> 开始
我想把这个链表分成两个部分,反转其中一个部分,然后重新连接。类似这样:
分割,O(1) 操作 4 ** 3 -> 2 -> 5 ** 0 -> 1 -> 开始
反转,O(n) 操作 0 ** 3 -> 2 -> 5 ** 4 -> 1 -> 开始
重新连接,O(1) 操作 0 -> 3 -> 2 -> 5 -> 4 -> 1 -> 开始
STL似乎没有循环链表,但我希望可以用(forward) list表示列表。这需要: * 将列表拆分为子列表的方法 * 合并列表的方法
使用std::list::splice合并子列表应该很容易,并且应该是O(1)操作。太好了!
然而,我找不到一个好的O(1)方法来将列表拆分为子列表。一种方法是使用迭代器,但我认为在我的情况下不适用,因为子列表在列表的末尾结束,并在列表的开头继续。
有没有有效的方法使用STL实现此算法?还是我应该放弃并编写自己的循环链表库?
谢谢!