【问题标题】:Doubly Linked Lists: Properly deleting an adding something in the middle of a list?双向链接列表:正确删除列表中间添加的内容?
【发布时间】:2016-08-30 10:09:11
【问题描述】:

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

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

(1)使右边的节点previous元素指向左边的节点

(2)使左边的next元素的节点指向右边的节点

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

但是我忘记了如何在代码中编写它(已经有一段时间了)。我在想它会是这样的(我假设 node 是一个包含 int 数据、node* next 和 node* previous 的结构):

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;

这样可以吗?

【问题讨论】:

    标签: c++ linked-list doubly-linked-list


    【解决方案1】:

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

    1. 您使用的命名不一致(left 应为 previous)。
    2. 您无需将p 的字段设置为nullptr,反正您要删除它。
    3. 最后一个x->previous = y 会使这个“圆形”不是你想要的!。

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

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

    但是,这有一个警告:如果列表是单例会发生什么?也就是说,你只有p?。请注意p->nextp->previous 都将是NULL,因此分配给xy 会出错! (请注意,作为第一个或最后一个元素会导致同样的问题,只是在某些方面)。

    第二部分代码有点问题:

    1. 首先请注意,您的代码无法编译:y 是一个变量,您通过y-> 取消引用它。这是只能在指针 [1] 上完成的操作。这个问题实际上更深刻,因为被放置在堆栈中的y 一离开范围就会被删除,因此如果你使用&y 来在你的链表中得到一个未定义的行为得到一个指针。
    2. y->previous = x->previous; 可以简化为 y->previous = p
    3. y->next = p->next; 可以简化为 y->next = x

    通过这些更正,这将变成:

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

    但是请注意,这再次不能处理p 指向列表末尾的情况! (p->next->previous = y 会发生什么?),所以你应该纠正它。另外,p 指向列表的开头而不是结尾是否重要?你应该处理吗?

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

    [1] 除非您实际上使用了 operator->() 重载,否则我假设您没有。

    【讨论】:

    • 感谢您的详细回复!你的解释很好,很容易理解。很抱歉不一致(使用left 而不是以前的),过去两周我一直在研究二叉搜索树,所以它一定已经爬进去了:P
    • 哈哈,没问题! :)。很高兴你发现它很容易理解。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多