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
相关产品推荐
相关产品推荐

