逆序打印链表的两种方式

逆序打印链表是面试中比较常见的问题,下面介绍两种方式:

普通的方式逆序打印链表

此方法的思路就是使用两个指针,一个指针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);
}

猜你喜欢

转载自blog.csdn.net/m0_38032942/article/details/81183222