Splice_after实现forward_list

时间:2012-01-08 02:43:45

标签: c++ singly-linked-list forward-list

forward_list中有一个函数splice_afterfor reference),具体来说,是给定链接中的函数#3。考虑到list是单独关联的,如何实现这一点。

作为练习,当我实现它时,我不得不迭代列表,直到我到first之前的节点(这样我可以将first连接到last)并再次我在last之前到达了节点(这样我就可以将当前列表的节点连接到last之前的节点)。这对我来说似乎并不是非常有效,并且想知道在没有迭代的情况下是否有更好的方法可以做到这一点?

2 个答案:

答案 0 :(得分:3)

我怀疑你误读了一些微妙的范围说明,即“(先,最后)”被移动,“[first,last)”(注意左括号/括号)。也就是说,正如名称所示,拼接操作仅在第一个对象之后开始。

该函数的实现实际上非常简单(如果忽略迭代器的常量以及它可能需要处理不同的分配器这一事实):

void splice_after(const_iterator pos, forward_list& other,
                  const_iterator first, const_iterator last) {
    node* f = first._Node->_Next;
    node* p = f;
    while (p->_Next != last._Node) { // last is not included: find its predecessor
        p = p->_Next;
    }
    first._Node->Next = last._Node;  // remove nodes from this
    p->_Next = pos._Node->_Next;     // hook the tail of the other list onto last
    pos._Node->_Next = f;            // hook the spliced elements onto pos
}

此操作具有线性复杂性,因为它需要找到last

的前身

答案 1 :(得分:2)

(社区维基,请提供)

 A -> B -> C -> D -> E
           ^
           ^ pos points to C

other列表中

 U -> V -> W -> X -> Y -> Z
      ^              ^
      ^ first        ^ last

致电.splice(pos, other, first, last)

我们要将W和X移到顶部列表中。即firstlast之间的所有内容,但不包括A->B->C->W->X->D->EU->V->Y->Z。最后以auto copy_of_first_next = first->next; first->next = last; // the `other` list has now been emptied auto copy_of_pos_next = pos->next; pos -> next = first; while(first->next != last) ++first; // `first` now points just before `last` first->next = copy_of_pos_next 位于顶部,{{1}}位于底部。

{{1}}