我已经用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();
}
您需要创建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;
}
[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;
}
您需要转到最后一个节点,将其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) 思