在常量空间内单向链表的反向输出

在常量空间内单向链表的反向输出

实现单向链表的反向输出并不困难,简单的方法是使用递归,空间复杂度是\(O(N)\)。本文介绍在常量空间内实现单向链表的反向输出。单向链表的方向是固定的一个方向,所以直接反向输出很困难。我们需要改变它的方向,将它的方向逆转以后,再输出的结果就是反向的。这一步我们称为反转链表

单向链表通常没有哨兵节点,遍历链表时结束的标志是判断下一个节点是否为空。它的过程如下图所示:

反转链表

一个节点的行为会影响到另外两个节点,幸运的是这三个节点彼此相连,所以我们需要准备三个节点。形象的命名为previousPoscurrentPosnextPos。每进入一个新节点就要改变方向——currentPos->next = previousPos,然后更新到下一个节点。代码如下:

void reverseList( )
{
    Node * previousPos, * currentPos, * nextPos;
    previousPos = nullptr;
    currentPos = head;
    nextPos = currentPos->next;
    while( nextPos != nullptr )
    {
        currentPos->next = previousPos;  // 改变方向
        
        // 更新信息
        previousPos = currentPos;
        currentPos = nextPos;
        nextPos = nextPos->next;
    }
    currentPos->next = previousPos;
    head = currentPos;
}

大体上分成两步,改变方向与更新信息。该函数是放在类的方法中,你也可以将该函数用于类外作为独立的函数使用,这个时候形式参数需要发生一些改变。在使用该函数时你需要注意到链表被反转后,如果你需要原来的链表,你应该不要忘记再反转一次。

posted @ 2025-07-27 17:37  永恒圣剑  阅读(11)  评论(0)    收藏  举报