C#双向链表TraverseBackward仅输出单值、删除指定节点问题求助
问题1:TraverseBackward仅打印单个姓名的原因及修复
核心原因
- 节点插入逻辑完全错误:你在Main函数中始终用初始的头结点
Ardhendu调用InsertNextNode,所有新节点都会被插到头结点和原有后续节点的中间,最终链表顺序完全不符合预期,且你调用反向遍历时传入的节点往前只能走1步就到null,所以只能打印单个值。 - 反向遍历入参错误:反向遍历需要传入链表尾节点作为起点,你传入的是头结点的下一级节点,往前遍历很快就遇到null终止。
- DeleteNode方法逻辑错误:删除节点时错误操作全局head指针,没有修改当前待删节点的前后节点关联,导致链表结构断裂。
修复步骤
- 修正插入逻辑:每插入一个节点就把当前指针移到新节点,保证顺序插入:
// 替换原来的for循环插入逻辑 MyDoublyLinkedList current = node; // 按顺序插入剩下9个节点 string[] names = {"Tom", "Jones", "David", "Andrew", "Peter", "Mark", "Collette", "Dave", "Dan"}; foreach (string name in names) { current.InsertNextNode(current, name); current = current.next; }
- 修正反向遍历调用:先找到尾节点再传入
// 先走到尾节点 MyDoublyLinkedList tail = node; while(tail.next != null) { tail = tail.next; } // 从尾节点开始反向遍历 node.TraverseBackward(tail);
- 修正DeleteNode方法的错误逻辑:
public void DeleteNode() { if (next == null)//当前是尾节点 { if (prev != null) { prev.next = null; } else { head = null; } } else if (prev == null)//当前是头结点 { next.prev = null; head = next; } else//当前是中间节点 { prev.next = next; next.prev = prev; } // 可选:把当前节点的前后指针置空避免误用 next = null; prev = null; }
问题2:正确删除Peter节点的方法
首先你需要把name字段的访问修饰符从private改成public,或者新增公开的GetName()方法,否则外部无法判断节点内容。
然后遍历找到Peter节点后调用DeleteNode即可:
// 从头开始找Peter节点 MyDoublyLinkedList toDelete = node; while(toDelete != null && toDelete.name != "Peter") { toDelete = toDelete.next; } // 找到后删除 if(toDelete != null) { toDelete.DeleteNode(); }
内容的提问来源于stack exchange,提问作者Dolfie
相关产品推荐
相关产品推荐

