Hot100-Day34-T206反转链表

16 阅读1分钟

Day33[26/4/2]T206反转链表

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

示例 1:

输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]

示例 2:

输入:head = [1,2]
输出:[2,1]

示例 3:

输入:head = []
输出:[]

提示:

  • 链表中节点的数目范围是 [0, 5000]
  • -5000 <= Node.val <= 5000

进阶:链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?

解题思路

仔细一看,顺序相反,那么压栈弹栈就完事了。

Code

#include <stack>
using namespace std;

struct ListNode
{
    int val;
    ListNode *next;
    ListNode() : val(0), next(nullptr) {}
    ListNode(int x) : val(x), next(nullptr) {}
    ListNode(int x, ListNode *next) : val(x), next(next) {}
};

class Solution
{
public:
    ListNode *reverseList(ListNode *head)
    {

        if (head == nullptr)
        {
            return nullptr;
        }

        stack<ListNode *> next_list;
        // 1. 压栈
        while (head != nullptr)
        {
            next_list.push(head);
            head = head->next;
        }

        // 2. 弹出
        head = next_list.top();
        ListNode *old_head = head;
        next_list.pop();
        while (!next_list.empty())
        {
            head->next = next_list.top();
            next_list.pop();
            head = head->next;
        }
        head->next = nullptr;
        return old_head;
    }
};