如何遍历链表
本文关键字:链表 遍历 何遍历 | 更新日期: 2023-09-27 18:35:28
我环顾四周,我真的找不到我能理解的答案,或者它不适用于我。我有这个类:
class Node
{
public int value;
public Node next;
}
我有一个名为 head
的成员变量,它是单个链表的头部。现在我正在尝试遍历链表的不同节点以搜索特定的value
。我知道如果我手动执行此操作,那么如果我想要第 5 个节点的value
,我会做head.next.next.next.next.value
。对于非常大的链表来说,这很快就会变得乏味,所以我的问题是我如何创建一些循环来迭代它,以便我可以检查链表每个节点中的value
变量?
我知道
这是一个旧帖子,但这是谷歌上弹出的内容,我确实有一个很好的替代方案来替代当前的最佳答案(不包括所需的值条件)
LinkedList<T> list = new LinkedList<T>();
for(LinkedListNode<T> node = list.First; node != null; node=node.Next){
//do stuff
}
这个版本显然使用 for 循环并将变量声明和增量移动到一行,允许您压缩和美化您的代码。
<小时 />稍后编辑:如果你想制作自己的链表(无论出于何种原因,咳咳),试试这个:
// assumed implementation of class
LinkedList myLinkedList = new LinkedList();
int searchForValue = 5; // origial poster wants to search for value
Node resultNode = null;
int resultIndex = 0;
for(Node iNode = myLinkedList.head; iNode!=null; iNode = myLinkedList.next) {
if(iNode.value == searchForValue) {
resultNode = iNode;
break;
}
resultIndex++;
}
if(resultNode!=null)
Console.WriteLine($"Found value at index {resultIndex} of {resultNode.value}");
这么多年后,我决定添加这个替代答案,因为我意识到我实际上并没有 100% 回答原始海报的问题,他们可能希望它被回答(也许他们想制作自己的链表)。因此,我现在通过提供一个更"合拍"的答案来公正地对待它。
但任何一个都足够了!
按如下方式循环访问类:
var currentNode = head;
while ((currentNode != null) && (currentNode.Value != desiredValue))
currentNode = currentNode.next;
当while
循环完成时,当前节点将被null
或包含具有所需值的节点。
对于此类列表,通常保留对当前节点的引用(从 head 开始),并在每次迭代后,将该引用的值更改为next
节点。当currentNode
变为null
时,您已经到达列表的末尾,因为最后一个元素没有下一个元素。
像这样:
Node currentNode = head;
while (currentNode != null) {
// do stuff with currentNode.value
currentNode = currentNode.Next;
}
顺便说一下,BCL 已经包含一些用于此类任务的有用类:
-
List<T>
,它在内部使用数组来存储元素并提供对它们的随机访问 -
LinkedList<T>
,它使用与自定义类相同的原理。
但也许出于某种原因,您需要按照自己的方式进行操作:)
尝试以下基本迭代:
Node tmp = head;
while (tmp != null)
{
//do your checking...
tmp = tmp.next;
}