当前位置: 首页 > 知识库问答 >
问题:

使用C#-RemoveLast方法实现单链表

哈烨熠
2023-03-14

我已经用C#实现了单链表。任何人都可以查看下面的代码并指出我的错误所在吗?

public int RemoveLast()
{
    if (Head != null)
    {
         var curNode = Head;

         while (curNode.Next != null)
         {
              curNode = curNode.Next;
         }

         var lastNodeValue = curNode.Value;

         curNode = null;
         Size--;
         return lastNodeValue;
     }

     return -1;
}

此函数不删除最后一个节点。我不知道出了什么问题。当while循环结束时,curNode中的node引用的next为null。这意味着这是最后一个节点。最后,我将此节点设置为null。但当我使用显示功能时。它还显示最后一个节点。这不是删除最后一个节点。

这里是我的显示功能:

    public string Display()
    {
        if (Head == null)
        {
            return string.Empty;
        }

        var curNode = Head;
        var builder = new StringBuilder();

        while (curNode.Next != null)
        {
            builder.Append($"{curNode.Value} ");
            curNode = curNode.Next;
        }

        builder.Append($"{curNode.Value} ");

        return builder.ToString();
    }

共有3个答案

司马德水
2023-03-14

您需要创建curNode。上一个节点上的下一个值为null。'curNode'是一个局部变量,将其设置为null除了可能延长其GC寿命外,没有任何作用。

public int RemoveLast()
{
    if (Head != null)
    {
         var curNode = Head;
         var previousNode = null;

         while (curNode.Next != null)
         {
              previousNode = curNode;
              curNode = curNode.Next;
         }

         var lastNodeValue = curNode.Value;

         if (previousNode == null)
             Head = null;
         else
             previousNode.Next = null;
         Size--;
         return lastNodeValue;
     }

     return -1;
}
文华美
2023-03-14
[x] -> [x] -> [x] -> null
               ^
               curNode (becomes null)
           ^
           this reference still exists

执行curNode=null操作时,不会更改列表中的任何引用curNode变量仅更改,它在操作前指向最后一个元素,之后变为null。

请尝试始终在最后一个节点之前保留对该节点的引用:

public int RemoveLast()
{
    if (Head != null)
    {
        var curNode = Head;
        // Corner case when there is only one node in the list
        if (Head.Next == null)
        {
            Head = null;
            Size--;
            return curNode.value;
        }

        var beforeLastNode = curNode;
        curNode = curNode.Next;
        while (curNode.Next != null)
        {
            beforeLastNode = curNode;
            curNode = curNode.Next;
        }

        var lastNodeValue = curNode.Value;

        beforeLastNode.Next = null;
        Size--;
        return lastNodeValue;
    }

    return -1;
}
狄宏大
2023-03-14

您需要转到最后一个节点,将其Next更改为null:

public int RemoveLast()
{
    if (Head != null)
    {
        var curNode = Head;

        while (curNode.Next?.Next != null)
        {
            curNode = curNode.Next;
        }

        var lastNodeValue = curNode.Next?.Value ?? -1;
        curNode.Next = null;
        Size--;
        return lastNodeValue;
    }

    return -1;
}

请注意,如果您还希望Head设置为null(如果它是唯一的节点),那么您可以这样做:

public int RemoveLast()
{
    if (Head != null)
    {
        var curNode = Head;

        while (curNode.Next?.Next != null)
        {
            curNode = curNode.Next;
        }

        int lastNodeValue;

        if (Head.Next == null)
        {
            lastNodeValue = Head.Value;
            Head = null;
        }
        else
        {
            lastNodeValue = curNode.Next?.Value ?? -1;
        }
        curNode.Next = null;
        Size--;
        return lastNodeValue;
    }

    return -1;
}

不过,我不得不说,这个Head属性看起来有点可疑——它可能应该属于不同的类。

 类似资料:
  • 本文向大家介绍C语言实现单链表实现方法,包括了C语言实现单链表实现方法的使用技巧和注意事项,需要的朋友参考一下 C语言实现单链表实现方法 链表和我们之前实现过的顺序表一样,都是简单的数据结构,链表分为单向链表、双向链表、循环链表。而单向链表又分为两种实现方法,一种为带头节点的单链表,一种为不带头节点的单链表。我们来具体看看不带头节点的单链表的实现 单链表:它是一种链式存储的线性表,用一组地址任意的

  • 本文向大家介绍C语言单链表实现方法详解,包括了C语言单链表实现方法详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C语言单链表实现方法。分享给大家供大家参考,具体如下: slist.h slist.cpp main.cpp 附:单链表优化版本 slist.h slist.cpp main.cpp 希望本文所述对大家C语言程序设计有所帮助。

  • 在试图理解如何在C#中实现单个列表时,我遇到了下面的链接: 创建一个非常简单的链表。 然而,由于我是C#的新手,我被上面讨论的第一部分中列出的语法弄糊涂了。正在声明一个名为节点的类,并且在声明为“公共节点下一个”的类中还有另一个语句。这个语句称为构造函数吗?请帮忙。

  • 本文向大家介绍C++链表倒序实现方法,包括了C++链表倒序实现方法的使用技巧和注意事项,需要的朋友参考一下 本文通过一个实例展示了C++实现链表倒序的方法,对于C++数据结构的学习有很好的参考借鉴价值。具体方法如下: 首先,C++链表倒序的难点在于如何一个个地修改。虽然不是数组,但是大概思想是一样的,所以可以用一个for循序,一个游标对应for循环里面的 i,只不过要记得前一个节点和后一个节点,尤

  • 本文向大家介绍Go语言单链表实现方法,包括了Go语言单链表实现方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Go语言单链表实现方法。分享给大家供大家参考。具体如下: 1. singlechain.go代码如下: 2. main.go代码如下: 希望本文所述对大家的Go语言程序设计有所帮助。

  • 本文向大家介绍C++实现单链表按k值重新排序的方法,包括了C++实现单链表按k值重新排序的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C++实现单链表按k值重新排序的方法。分享给大家供大家参考,具体如下: 题目要求: 给定一链表头节点,节点值类型是整型。 现给一整数k,根据k将链表排序为小于k,等于k,大于k的一个链表。 对某部分内的节点顺序不做要求。 算法思路分析及代码(C) 思