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

单链表交替删除Segment节点并调整位置的代码正确性问询

验证毛毛虫单链表eat方法的核心逻辑要点

核心需求明确

先把需求拆解成可验证的规则:

  • 单链表节点Segment包含position(原位置序号,从1开始)和color属性
  • 执行eat方法时,删除所有偶数位的节点(如7段链表删除第2、4、6位)
  • 剩余节点需重新分配连续的position(从1开始递增),保留原节点的color
  • 被删除节点的原position需按删除顺序压入previouslyOccupiedPositions栈(栈顶为最后删除的位置)

头部处理的验证要点

头部节点是原链表的第1位(奇数位),不会被删除,需确认:

  1. 若原链表为空:直接返回,栈无操作,无异常
  2. 若原链表仅1个节点:无需删除,position保持1,栈无操作
  3. 多节点场景:头部节点的position最终会被设置为1(若按新顺序分配),且链表指针不会断裂

删除与位置更新逻辑验证

以7段毛毛虫为例,走一遍正确流程:
原链表:1(colorA) → 2(colorB) → 3(colorC) → 4(colorD) → 5(colorE) → 6(colorF) → 7(colorG)
执行步骤:

  1. 计数从1开始遍历,第1位(节点1)保留,设置position=1,继续
  2. 第2位(节点2)删除,将position=2压栈,前驱节点(节点1)的next指向节点3
  3. 第3位(节点3)保留,设置position=2,继续
  4. 第4位(节点4)删除,将position=4压栈,前驱节点(节点3)的next指向节点5
  5. 第5位(节点5)保留,设置position=3,继续
  6. 第6位(节点6)删除,将position=6压栈,前驱节点(节点5)的next指向节点7
  7. 第7位(节点7)保留,设置position=4,结束

最终结果:

  • 链表:1(colorA) → 2(colorC) → 3(colorE) → 4(colorG)
  • 栈内容:[2,4,6](栈顶为6)

需排查的常见错误:

  • 计数从0开始:会误删第1位节点
  • 位置更新逻辑错误:比如用原position减去已删除节点数,导致位置不连续
  • 链表指针维护错误:删除节点时未正确设置前驱节点的next,导致链表断裂
  • 栈顺序错误:未按删除顺序压栈,导致后续栈操作不符合预期

参考实现示例

如果你的代码存在疑问,可以对比以下标准实现(Java风格):

public class Caterpillar {
    private Segment head;
    private Stack<Integer> previouslyOccupiedPositions;

    static class Segment {
        int position;
        String color;
        Segment next;

        Segment(int position, String color) {
            this.position = position;
            this.color = color;
            this.next = null;
        }
    }

    public void eat() {
        if (head == null) {
            return;
        }
        previouslyOccupiedPositions = new Stack<>();
        Segment current = head;
        Segment prev = null;
        int count = 1; // 原位置计数,从1开始
        int newPos = 1; // 剩余节点的新位置计数器

        while (current != null) {
            if (count % 2 == 0) {
                // 删除偶数位节点,压栈原位置
                previouslyOccupiedPositions.push(current.position);
                prev.next = current.next;
            } else {
                // 保留奇数位节点,更新新位置
                current.position = newPos;
                newPos++;
                prev = current;
            }
            current = current.next;
            count++;
        }
    }
}

验证方法

可以通过以下测试用例验证你的代码:

  • 测试用例1:2段链表 → 删除第2段,剩余节点position=1,栈内容[2]
  • 测试用例2:3段链表 → 删除第2段,剩余节点1→2(原第3段的position更新为2),栈内容[2]
  • 测试用例3:7段链表 → 结果如上述流程,验证链表节点的position连续性、颜色保留情况及栈内容

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 08:10:11