一、逆序打印(只遍历一次)
如果没有要求只遍历一次,那么就可以用循环就可以解决,但其难点在于遍历一次,要解决此问题就必须用到递归。
代码实现:
void PrintListTailToHead(pSeqList pHead)
{
if (pHead == NULL)
{
return;
}
PrintListTailToHead(pHead->pNext);
printf(“%d “, pHead->_data);
}
注意:递归条件的设置(条件不对,递归不会停止,程序会因为内存耗尽而崩溃)
二、逆置(只遍历一次)
与上面逆序打印不同的是逆置需要改变节点的指向,因此可以把第一节点当一个新的链表,把后面的节点头插即可完成要求。
代码实现:
void ReverseList(pSeqList* pHead)
{
assert(pHead);
pSeqList proNode = *pHead;
pSeqList NextNode = proNode;
pSeqList NowNode = NULL;
if ((*pHead == NULL) || (proNode->pNext == NULL))
{
return;
}
//第一个节点为新的链表,所以需要从第二个节点开始
proNode = proNode->pNext;
while (proNode != NULL)
{
NowNode = proNode;//保存当前节点
proNode = proNode->pNext;//走到后一个节点
//头插
NowNode->pNext = NextNode;
NextNode = NowNode;
}
//当头插时原链表的第一个节点为新链表的最后一个节点,因此要制空
(*pHead)->pNext = NULL;
*pHead = NowNode;
}
注意:当链表为空和只有一个节点时逆置是没有意义的,出循环时把新链表的最后一个节点制NULL,否则会形成环。