单链表交替删除Segment节点并调整位置的代码正确性问询
验证毛毛虫单链表
eat方法的核心逻辑要点 核心需求明确
先把需求拆解成可验证的规则:
- 单链表节点
Segment包含position(原位置序号,从1开始)和color属性 - 执行
eat方法时,删除所有偶数位的节点(如7段链表删除第2、4、6位) - 剩余节点需重新分配连续的
position(从1开始递增),保留原节点的color - 被删除节点的原
position需按删除顺序压入previouslyOccupiedPositions栈(栈顶为最后删除的位置)
头部处理的验证要点
头部节点是原链表的第1位(奇数位),不会被删除,需确认:
- 若原链表为空:直接返回,栈无操作,无异常
- 若原链表仅1个节点:无需删除,
position保持1,栈无操作 - 多节点场景:头部节点的
position最终会被设置为1(若按新顺序分配),且链表指针不会断裂
删除与位置更新逻辑验证
以7段毛毛虫为例,走一遍正确流程:
原链表:1(colorA) → 2(colorB) → 3(colorC) → 4(colorD) → 5(colorE) → 6(colorF) → 7(colorG)
执行步骤:
- 计数从1开始遍历,第1位(节点1)保留,设置
position=1,继续 - 第2位(节点2)删除,将
position=2压栈,前驱节点(节点1)的next指向节点3 - 第3位(节点3)保留,设置
position=2,继续 - 第4位(节点4)删除,将
position=4压栈,前驱节点(节点3)的next指向节点5 - 第5位(节点5)保留,设置
position=3,继续 - 第6位(节点6)删除,将
position=6压栈,前驱节点(节点5)的next指向节点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
相关产品推荐
相关产品推荐

