剑指Offer-题6-从尾到头打印链表

Author Avatar
Orange 3月 27, 2018
  • 在其它设备中阅读本文章

题目:从尾到头打印链表

输入一个链表的头结点,从尾到头反过来打印每个结点的值。链表结点定义如下:

1
2
3
4
struct ListNode{
int value;
ListNode* pNext;
};

解析

链表不同数组,查找某节点只能老老实实从头遍历。循环倒序遍历需要时间复杂度为O(n^2),不可取。分如下两种情况优化:

  1. 如果可以反转链表,遍历中调整 pNext 指针指向,最后遍历即可。代码如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    void printListReversely(ListNode *pHead)
    {
    if (nullptr == pHead)
    return;
    ListNode *pNode = nullptr;
    ListNode *pNodeNext = pHead;
    ListNode *pTemp = nullptr;
    while (pNodeNext != nullptr)
    {
    pTemp = pNodeNext->pNext;
    pNodeNext->pNext = pNode;
    pNode = pNodeNext;
    pNodeNext = pTemp;
    }
    while (pNode != nullptr)
    {
    printf("%d\n", pNode->value);
    pNode = pNode->pNext;
    }
    }
  2. 如果禁止修改链表,遍历中倒序存储节点内容,最后遍历即可。空间复杂度O(n)、时间复杂度O(n),此举是以空间换时间。代码如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    void printListReversely(ListNode *pHead)
    {
    if (nullptr == pHead)
    return;
    std::stack<ListNode*> nodes;
    ListNode *pNode = pHead;
    while (pNode != nullptr)
    {
    nodes.push(pNode);
    pNode = pNode->pNext;
    }
    while (!nodes.empty())
    {
    pNode = nodes.top();
    printf("%d\n", pNode->value);
    nodes.pop();
    }
    }

CC许可协议署名非商业性使用相同方式共享
本文采用 CC BY-NC-SA 3.0 Unported 协议进行许可