在常量时间内实现单向链表的插入与删除操作
实现单向链表的插入与删除操作,常规方法是遍历,时间复杂度是\(O(N)\)。我们可以通过改变当前节点的下一个节点来实现单向链表的插入与删除操作,这样时间复杂度就是\(O(1)\)。示意图如下:
对于后位插入,我们通常可以忽略,因为这对双向链表与单向链表都很简单。示意图中主要展示前位插入。插入与删除的代码:
iterator insert( iterator itr, const Object & x )
{++theSize;Node * p = itr.current;p->next = new Node{ p->data, p->next };p->data = x;if( itr == end( ) )tail = tail->next;return { p->next };
}
iterator erase( iterator itr )
{--theSize;Node * p = itr.current;Node * d = p->next;p->data = p->next->data;p->next = p->next->next;delete d;return itr;
}
iterator
是内置的迭代器。整个操作的重点是副本,灵活运用副本,因为单向链表无法回溯到前一个节点。