C++双向链表insert方法实现触发索引越界异常问题求助
问题产生原因
- size成员变量完全未生效:LinkedList类中定义的public成员
size既没有在构造函数中初始化,也没有在append插入元素时更新,存储的是内存随机脏值。get_node方法中判断index >= size的边界校验逻辑完全失效,你调用a.insert(3,1)时内部要调用get_node(0),如果此时size的脏值刚好小于等于0,就会直接触发range_error异常。 - append方法逻辑存在严重缺陷:现有
append只处理了空链表插入第一个节点、只有头节点插入第二个节点的情况,插入第三个及以上节点时没有任何处理逻辑,你调用5次append实际只有前两个节点正确接入链表,后续3、4、5节点全部丢失,tail指针也不会更新,链表实际长度和你预期的5完全不符。 - insert方法实现不完整:现有代码只修改了前驱节点的next指针指向新节点,新节点的prev、next指针完全没有赋值,后继节点的prev指针也没有修改,也没有处理插入位置为头、插入位置为尾部的边界情况,即使越界问题修复也会后续触发空指针访问崩溃。
修复方案
1. 修正size变量的管理
构造函数初始化size为0,每次成功插入元素(append、insert)后size自增1。
2. 重写append方法
void append(int value) { Node *new_node = new Node(value); size++; if (head == nullptr) { head = new_node; tail = new_node; return; } tail->next = new_node; new_node->prev = tail; tail = new_node; }
3. 重写insert方法
void insert(int val, int index) { // 先校验插入索引合法性:允许插入到0到size的位置(插入到size就是尾插) if (index < 0 || index > size) { throw range_error("IndexError: Index out of range"); } // 头插情况 if (index == 0) { Node *new_node = new Node(val); new_node->next = head; if (head != nullptr) { head->prev = new_node; } head = new_node; // 如果是空链表插入,tail也要指向新节点 if (tail == nullptr) { tail = new_node; } size++; return; } // 尾插情况直接调用append if (index == size) { append(val); return; } // 中间插入 Node *prev_node = get_node(index - 1); Node *next_node = prev_node->next; Node *new_node = new Node(val); new_node->prev = prev_node; new_node->next = next_node; prev_node->next = new_node; next_node->prev = new_node; size++; }
4. 修复print方法的空指针风险
void print() { Node *current = head; cout << "["; while (current != nullptr) { cout << current->value; if (current->next != nullptr) { cout << ", "; } current = current->next; } cout << "]" << endl; }
5. 构造函数补充size初始化
LinkedList() { head = nullptr; tail = nullptr; size = 0; }
修复后运行测试代码就可以得到预期输出:
[1, 2, 3, 4, 5] [1, 3, 2, 3, 4, 5]
内容的提问来源于stack exchange,提问作者N.A.
相关产品推荐
相关产品推荐

