我正在为 C++ 中的双链表编写代码。但是,我有一个问题,我不知道如何在其他节点之前添加节点。我有这些。
template<class T>
void LinkedListD<T>::addNodeBeforeTo(Node<T> *before, T info) {
Node<T>* newNode = new Node<T>( info );
if ( isEmpty() ){
head = newNode;
last = newNode;
} else{
if ( before == head ){
newNode->next = head;
head = newNode;
} if ( before == last ){
newNode->previous = last;
last = newNode;
}
else{
Node<T>* act = head;
Node<T>* past = last;
while ( act->next != before && past->previous != before){
act = act->next;
past = past->previous;
}
newNode->previous = past->previous;
newNode->next = act->next;
act->next = newNode;
past->previous = newNode;
}
}
}
例子是 10, 15, 20, 12 Add node before to 20: 30 Finish Output 10, 15, 30, 20, 12 Thks
你根本不需要while
循环。每个节点都知道它两侧的节点,这就是正确更新列表所需的全部内容。给定输入节点before
,您所要做的就是:
newNode->previous
为指向before->previous
节点newNode->next
为指向before
节点before->previous
不为空,则设置before->previous->next
为指向newNode
节点before->previous
为指向newNode
节点before
指向head
节点,则设置head
为指向newNode
节点。完成。
此外,此代码中还有其他一些逻辑错误。当插入之前的head
节点,你没有更新head->previous
在指向newNode
节点更新前head
本身。并且由于您的函数在给定节点之前插入,您根本不应该尝试在节点之后插入last
,该作业应该由单独的addNodeAfterTo()
方法处理。
尝试更像这样的事情:
template<class T>
Node<T>* LinkedListD<T>::addNodeBeforeTo(Node<T> *before, const T &info) {
if ( !before ) return nullptr;
Node<T>* newNode = new Node<T>( info );
newNode->previous = before->previous;
newNode->next = before;
if ( before->previous )
before->previous->next = newNode;
before->previous = newNode;
if ( before == head )
head = newNode;
return newNode;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句