剑指offer3_从尾到头打印链表_题解

从尾到头打印链表

题目描述

输入一个链表,按链表从尾到头的顺序返回一个ArrayList。

示例1

输入

{67,0,24,58}

返回值

[58,24,0,67]

分析

方案一:反转链表

设置pre节点指向正在反转节点的前一个节点,初始化为NULL

设置cur节点指向反转节点,cur初始化为head

设置next节点指向cur的下一个节点

代码

/**
复杂度分析
1.时间复杂度:O(n)
2.空间复杂度:O(1)
**/
class Solution
{
public:
    vector<int> printListFromTailToHead(ListNode *head)
    {
        vector<int> ans;
        ListNode *pre = NULL;
        ListNode *cur = head;

        while (cur != NULL)
        {
            ListNode *next = cur->next; //next指针指向cur的下一个节点

            cur->next = pre; //反转
            pre = cur;       //pre右移
            cur = next;      //cur右移
        }
        // 遍历反转后的单链表,将元素保存到数组ans中
        while (pre != NULL)
        {
            ans.push_back(pre->val);
            pre = pre->next;
        }
        return ans;
    }
};

方案二:使用reverse()函数

在遍历的过程中,把结点的值加入到vector中,然后使用reverse库函数反转vector

/**
复杂度分析
1.时间复杂度:O(n)
2.空间复杂度:O(n)
**/
class Solution
{
	// reverse函数
    vector<int> printListFromTailToHead(ListNode *head)
    {
        vector<int> ans;
        // 从头到尾将结点的值加入ans
        while (head != NULL)
        {
            ans.push_back(head->val);
            head = head->next;
        }
        // 使用reverse库函数反转ans
        reverse(ans.begin(), ans.end());
        return ans;
    }
};

方案三:递归版本

class Solution
{
public:
    // 递归解法
    vector<int> printListFromTailToHead(ListNode *head)
    {
        vector<int> ans;
        if(head == NULL){
            return ans;
        }
        ans = printListFromTailToHead(head->next);
        ans.push_back(head->val);
        return ans;
    }
};
posted @ 2020-12-03 23:08  RiverCold  阅读(63)  评论(0编辑  收藏  举报