当前位置: 首页 > 知识库问答 >
问题:

双链接列表:正确删除列表中间添加的内容?

南门志
2023-03-14

编写适当删除双链接列表中由p(数据值14)指向的节点的代码片段。

我想我知道如何做到这一点:

(1)使右侧的节点的前一个元素指向左侧的节点

(2)使左侧的节点的下一个元素指向右侧的节点

(3) 将p指向NULL的节点元素设置为NULL并将其删除。

但是我忘记了如何用代码写这个(已经有一段时间了)。我在想它会是这样的(我假设节点是一个结构,它保存一个int数据,节点*下一个,节点*上一个):

node* x = p->next;
node* y = p->previous;
x->previous = y;
y->next = x;
p->previous = nullptr;
p->next = nullptr;
delete p;
x->previous = y;

编写代码片段以插入介于14和16之间的节点(同一图片):

node *x = p->next;
node y;
y->previous = x->previous;
y->next = p->next;
x->previous = y; 
p->next = y;

这样行吗?

共有1个答案

万德海
2023-03-14

删除代码几乎没有问题。但是,请注意以下几点:

  1. 您使用的命名不一致(left应该是previous
  2. 您无需将p的字段设置为null ptr,您将以任何方式删除它
  3. 最后一个x-

这将是一个更好的近似值:

node *x = p->next;
node *y = p->previous;
x->previous = y;
y->next = x;
delete p;

然而,这有一个警告:如果列表是单身,会发生什么?也就是说,您只有p?。请注意,p-

代码的第二部分有点问题:

  1. 首先请注意,您的代码不会编译:y是一个变量,您正在通过y取消对它的引用-

有了这些更正,这将变成:

node *y = new node();
y->previous = p;
y->next = p->next;
p->next->previous = y;
p->next = y;

但是,请注意,这再次不能处理p指向列表末尾的情况!(使用p会发生什么情况-

唯一的实际问题是动态内存,其余的更正只是“可读性”更正。尽管“可读性”是个人偏好,但您应该始终尽可能使代码清晰。

[1]除非您实际使用操作符-

 类似资料:
  • 我有一个头和lastNode的参考。嗨我有个问题。当我删除双向链表中的最后一个节点时,我必须将该节点的前一个引用设置为空,或者我可以离开它。我在删除lastNode时做了这样的事情。 当我使用toString方法时,它会按预期打印。只是想知道是否有必要将旧的last node prev设置为null。或者垃圾收集器只是删除它,因为没有对它的引用,即使旧节点仍然有对链接列表中某个节点的引用

  • 我正在尝试使用时循环将元素添加到双向链表中。节点正在制作中,但它们都存储相同的单词,这是我正在阅读的文件的最后一个单词。这是我的时循环: 在while循环开始之前,光标被初始化为列表的开头。 这是我的节点结构: 我的时循环出了什么问题?为什么它总是覆盖以前的节点?请并谢谢你!

  • 我有麻烦删除双向链表中的节点,程序崩溃,我不能解决这个问题。你能帮我吗?这是创建新节点,查看它们并删除它们的完整代码。 我认为这个问题与Node del的scanf()有关,但我不确定。当我只是通过或

  • 以下代码删除双链接列表中的第一个节点。 如果列表只包含1个元素,我们将last的引用设置为null。我的问题是,我们为什么不将first的引用设置为null?这会有什么不同吗?

  • 我已经得到了实现双向链表的框架。我被PushFront()方法难住了。方法应该将提供的元素添加到链表的前面,并且应该将地址返回到新的头节点。我对如何访问列表的当前头部感到困惑,以便我可以将其分配给pNext指针。到目前为止,PushTop()方法看起来是这样的: 元素类构造函数: 数据类: 主要: 我的理解是,您通常会在调用PushFron()时提供头的地址,但是因为我没有提供,我不确定如何访问它