我环顾四周,无法找到我能理解的答案,或者它不适用于我。我有这门课:
class Node
{
public int value;
public Node next;
}
我有一个名为head
的成员变量,它是单个链表的头部。现在我试图遍历链表的不同节点以搜索特定的value
。我知道如果我手动执行,那么如果我想要第5个节点的head.next.next.next.next.value
,我会value
。对于非常大的链表而言,这很快就会变得乏味,所以我的问题是如何创建一些循环来迭代这个,以便我可以检查链表的每个节点中的value
变量?
答案 0 :(得分:4)
按如下方式遍历您的课程:
var currentNode = head;
while ((currentNode != null) && (currentNode.Value != desiredValue))
currentNode = currentNode.next;
当while
循环完成时,currentNode将为null
或包含具有所需值的节点。
答案 1 :(得分:2)
对于这种类型的列表,通常会保留对当前节点(以头部开头)的引用,并在每次迭代后,将该引用的值更改为next
节点。当currentNode
变为null
时,您已到达列表的末尾,因为最后一个元素没有下一个元素。
这样的事情:
Node currentNode = head;
while (currentNode != null) {
// do stuff with currentNode.value
currentNode = currentNode.Next;
}
顺便说一下,BCL已经为这类任务包含了一些有用的类:
List<T>
,内部使用数组存储元素并提供对它们的随机访问LinkedList<T>
,它使用与您的自定义类相同的原则。但也许你需要按照某种原因这样做:)
答案 2 :(得分:1)
尝试这个基本的迭代:
Node tmp = head;
while (tmp != null)
{
//do your checking...
tmp = tmp.next;
}
答案 3 :(得分:1)
我知道这是一篇过时的文章,但这是google上弹出的内容,对于目前的最佳答案,我确实有很好的选择(不包括所需的取值条件)
LinkedListNode<ChunkObject> list = new LinkedListNode<ChunkObject>();
for(LinkedListNode<Object> node=list.First; node != null; node=node.Next){
//do stuff
}
此版本显然使用了for循环,并将变量声明和增量移动到一行,从而可以压缩和美化代码。