You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中使用Setter、Getter反转双向链表的问题排查

双向链表反转函数的问题分析与修正

你的reverse函数存在多处逻辑错误,这是导致程序崩溃或displayList失效的核心原因:

原函数的关键问题

  • 无限循环:循环内没有推进curPtr,curPtr始终指向初始的headPtr,永远不会等于NULL,导致程序陷入死循环最终崩溃。
  • 指针操作逻辑混乱:连续多次重复调用setPrev,覆盖了之前的赋值,完全没有正确交换节点的prev和next指针。比如先把curPtr的prev设为temp,立刻又把prev设为curPtr的next,之前的赋值完全无效。

修正后的reverse函数实现

template<class ItemType>
void LinkedList<ItemType>::reverse()
{
    Node<ItemType>* curPtr = headPtr;
    Node<ItemType>* temp = nullptr;

    // 遍历链表,逐个交换节点的prev和next指针
    while(curPtr != nullptr)
    {
        // 保存当前节点的next指针,避免被覆盖后丢失
        temp = curPtr->getNext();
        // 交换当前节点的next和prev
        curPtr->setNext(curPtr->getPrev());
        curPtr->setPrev(temp);
        // 推进curPtr到下一个节点(原来的next)
        curPtr = temp;
    }

    // 交换headPtr和tailPtr,因为反转后首尾节点互换
    Node<ItemType>* tempHead = headPtr;
    headPtr = tailPtr;
    tailPtr = tempHead;
}

额外说明

  • 假设你的LinkedList类维护了tailPtr(双向链表通常会有尾指针),如果没有,需要在反转后更新headPtr为原来的尾节点,否则displayList会从旧的头节点开始遍历,而旧头节点的next已经是NULL,导致只能输出一个元素或者完全无输出。
  • 你的displayList函数依赖getEntry(pos)方法,只要getEntry是基于当前headPtr正确实现的,反转后就能正常遍历输出反转后的列表。

内容的提问来源于stack exchange,提问作者evanparial

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 16:40:26