我正在为我的Uni做一个链接列表实现,我在演示文稿中遇到了这个代码。
template <class X> bool linkedList<X>::deleteElement(node<X> *p)
if (p=NULL)
return false;
if(p->next!=NULL)
p->next->prev = p->prev;
if(p->prev!=NULL)
p->prev->next = p->next;
else
head = p->next
我想知道p->next->prev = p->prev;
部分是否与说p = p->prev;
相同,因为下一个p的前一个是p本身。
提前感谢您的任何答案。
编辑1:修正了拼写错误并添加了一些代码以使其更加清晰。
答案 0 :(得分:8)
不完全。 p
是一个局部变量。 p->next->prev
是p->next
上的实例变量。改变前者不会影响结构,而改变后者则会。换句话说,它们的值可能相同,但存储这些值的内存地址是不同的。
答案 1 :(得分:8)
我想知道
相同p->next->prev = p->prev;
部分是否与说p = p->prev
不,不是。它正在设置列表中prev
节点之后的next
节点的p
字段。
代码正从列表中删除p
节点。需要更新p
节点两侧的两个周围节点,以停止指向p
节点,而是指向彼此。你展示的只是必要更新的一半。您需要添加另一半:if (p->prev != NULL) p->prev->next = p->next;
。您还需要检查p
是否指向列表的头节点,如果是,则将头部更新为指向p->next
。同样,列表的尾节点(如果有)指向p->prev
。
此外,代码中的if(p=NULL)
错误,应该是if(p==NULL)
。代码中的if(p->next==NULL)
也是错误的,而应该是if(p->next!=NULL)
。
这是正确的实施:
template <class X> bool linkedList<X>::deleteElement(node<X> *p)
{
if (p == NULL)
return false;
if (p->next != NULL)
p->next->prev = p->prev;
if (p->prev != NULL)
p->prev->next = p->next;
if (p == head)
head = p->next;
// if your list has a tail:
if (p == tail)
tail = p->prev;
// if your list owns the memory for the nodes:
delete p; // or however you free it
return true;
}
最后,您应该考虑使用STL std::list
容器而不是手动实现。