如何遍历链表

本文关键字:链表 遍历 何遍历 | 更新日期: 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;
}