在链表中间插入元素时输出错误,请问对应代码哪里存在问题
链表中间插入代码错误分析
你的代码存在以下3个核心问题:
链表长度计算错误
你当前的长度统计逻辑得到的是总节点数-1,而非实际节点数量。示例:单节点链表的统计结果为0,双节点为1,完全不符合后续mid计算的基准要求。
错误代码段:while (curr->next != NULL) { len++; curr = curr->next; }要统计正确长度,要么修改循环条件为
while (curr != NULL),要么后续mid计算适配当前len的取值规则。mid计算规则和遍历逻辑不匹配
常规的中间插入规则为:总节点数为n时,新节点插入到第⌊n/2⌋个节点之后(1索引规则下,偶数长度插在第n/2个节点后,奇数长度插在第(n+1)/2个节点前)。按你当前得到的len = n-1的前提,计算出的mid会让curr2多移动1次,最终停在插入位置的下一个节点,而非需要操作的前驱节点。
示例:双节点链表n=2,你的len=1,计算得到mid=1,遍历执行1次后curr2指向第二个节点,新节点插入到第二个节点之后,正确位置应该是第一个节点之后。缺少极端场景适配
当链表长度为1时你的逻辑刚好生效,但长度>=2的链表都会出现插入位置偏移1位的问题。
修复后参考代码
Node *insertInMiddle(Node *head, int x) { Node *temp = new Node(x); if (head == NULL) return temp; // 先计算正确的链表长度 int len = 0; Node *curr = head; while (curr != NULL) { len++; curr = curr->next; } // 计算要插入位置的前驱节点索引(0索引) int mid = (len % 2 == 0) ? (len/2 - 1) : (len-1)/2; Node *curr2 = head; while (mid--) curr2 = curr2->next; // 执行插入 temp->next = curr2->next; curr2->next = temp; return head; }
内容的提问来源于stack exchange,提问作者Nisargpool
相关产品推荐
相关产品推荐

