逆序打印链表是面试中比较常见的问题,下面介绍两种方式:
普通的方式逆序打印链表
此方法的思路就是使用两个指针,一个指针tail负责指向上一次刚刚被打印的元素,这样每次pCur指针每次都以tail指针标记作为结束,这样直到tail指针指向头结点的时候就证明已经打印完成了。看看下面这个小电影就能很容易的明白:
//1. 逆序打印单向链表
void PrintTailToHead(pList plist)
{
pNode pCur = NULL;
pNode tail = NULL;
assert(plist != NULL);
pCur = plist;
while (tail != plist)
{
while (pCur->next != tail)
{
pCur = pCur->next;
}
printf("%d ", pCur->data);
tail = pCur;
pCur = plist;
}
}
接下来说说一个另一个简单的方式!!!
递归的方式逆序打印链表
递归往往可以将复杂问题简单化,这里的极限条件是传入的参数不为空,那么直到将链表末尾的【NULL】传入才会直接返回,这样的话层层递归打印出的便是倒序的输出:
//递归的方式打印
void PrintTailToHead_R(pList plist)
{
if (plist == NULL)
return;
PrintTailToHead_R(plist->next);
printf("%d ",plist->data);
}