在常量空间内单向链表的反向输出
在常量空间内单向链表的反向输出
实现单向链表的反向输出并不困难,简单的方法是使用递归,空间复杂度是\(O(N)\)。本文介绍在常量空间内实现单向链表的反向输出。单向链表的方向是固定的一个方向,所以直接反向输出很困难。我们需要改变它的方向,将它的方向逆转以后,再输出的结果就是反向的。这一步我们称为反转链表。
单向链表通常没有哨兵节点,遍历链表时结束的标志是判断下一个节点是否为空。它的过程如下图所示:

一个节点的行为会影响到另外两个节点,幸运的是这三个节点彼此相连,所以我们需要准备三个节点。形象的命名为previousPos、currentPos、nextPos。每进入一个新节点就要改变方向——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;
}
大体上分成两步,改变方向与更新信息。该函数是放在类的方法中,你也可以将该函数用于类外作为独立的函数使用,这个时候形式参数需要发生一些改变。在使用该函数时你需要注意到链表被反转后,如果你需要原来的链表,你应该不要忘记再反转一次。
浙公网安备 33010602011771号