[TOC]

1. 题目描述

  • 描述

    输入一个链表,反转链表后,输出新链表的表头。

  • 示例1

    输入:
    {1,2,3}
    复制
    返回值:
    {3,2,1}

2. 解题思路

  • 思路1, 递归反转

    处理完成后内部传出头指针, 然后将当前节点挂接到自己的子节点上面;

  • 思路2, 缓存方案

    好处是不会因递归深度而爆栈, 用vector存储所有节点, 然后从后往前遍历重新拼接即可;

PS: 实际方案选择, 可以根据题目要求, 和自己的习惯选择实现起来最快, 或者 出题人要求的算法来写代码;

3. 详细代码

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
            val(x), next(NULL) {
    }
};*/
class Solution {
public:
    ListNode* ReverseList(ListNode* pHead) {
        if (pHead == nullptr) {
            return pHead;
        }
        ListNode* head = pHead->next;
        vector<ListNode*> nodes{pHead};
        while (head) {
            nodes.push_back(head);
            head = head->next;
        }
        for (int i = nodes.size()-1; i > 0; i--) {
            nodes[i]->next = nodes[i-1];
        }
        nodes[0]->next = nullptr;
        return nodes.back();
    }
};

4. 运行结果

图片说明