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

C#双向链表TraverseBackward仅输出单值、删除指定节点问题求助

问题1:TraverseBackward仅打印单个姓名的原因及修复

核心原因

  1. 节点插入逻辑完全错误:你在Main函数中始终用初始的头结点Ardhendu调用InsertNextNode,所有新节点都会被插到头结点和原有后续节点的中间,最终链表顺序完全不符合预期,且你调用反向遍历时传入的节点往前只能走1步就到null,所以只能打印单个值。
  2. 反向遍历入参错误:反向遍历需要传入链表尾节点作为起点,你传入的是头结点的下一级节点,往前遍历很快就遇到null终止。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 18:36:08