如何在双向链表c ++之前添加节点
How add node before doubly linked list c++
我正在用 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
添加节点之前到 20:30
完成输出 10、15、30、20、12
谢谢
您必须了解如何有条不紊地(n 是您要在其前面插入 new_item 对象的对象):
if (head != nullptr) // i.e. if list is not empty
{
}
if (new_item.P == nullptr) // i.e. if new_item is first
head = new_item;
您根本不需要 while
循环。每个节点都知道它两侧的节点,这就是正确更新列表所需的全部内容。给定输入节点before
,你所要做的就是:
- 设置
newNode->previous
指向before->previous
节点
- 设置
newNode->next
指向before
节点
- 如果
before->previous
不为空,设置before->previous->next
指向newNode
节点
- 设置
before->previous
指向newNode
节点
- 如果
before
指向 head
节点,设置 head
指向 newNode
节点。
完成。
此外,您的代码中还有其他一些逻辑错误。在 head
节点 之前插入 时,您不会在更新 head
本身之前更新 head->previous
以指向 newNode
节点。并且由于您的函数在给定节点 before 之前插入,因此您根本不应该尝试在 last
节点 after 插入 节点,那项工作应该由单独的 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;
}
我正在用 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 添加节点之前到 20:30 完成输出 10、15、30、20、12 谢谢
您必须了解如何有条不紊地(n 是您要在其前面插入 new_item 对象的对象):
if (head != nullptr) // i.e. if list is not empty
{
}
if (new_item.P == nullptr) // i.e. if new_item is first
head = new_item;
您根本不需要 while
循环。每个节点都知道它两侧的节点,这就是正确更新列表所需的全部内容。给定输入节点before
,你所要做的就是:
- 设置
newNode->previous
指向before->previous
节点 - 设置
newNode->next
指向before
节点 - 如果
before->previous
不为空,设置before->previous->next
指向newNode
节点 - 设置
before->previous
指向newNode
节点 - 如果
before
指向head
节点,设置head
指向newNode
节点。
完成。
此外,您的代码中还有其他一些逻辑错误。在 head
节点 之前插入 时,您不会在更新 head
本身之前更新 head->previous
以指向 newNode
节点。并且由于您的函数在给定节点 before 之前插入,因此您根本不应该尝试在 last
节点 after 插入 节点,那项工作应该由单独的 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;
}