定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
剑指 Offer 24. 反转链表https://leetcode.cn/problems/fan-zhuan-lian-biao-lcof/
法1:递归
ListNode* reverseList(ListNode* head) {
// base case
if (head == nullptr)
{
return nullptr;
}
if (head->next == nullptr)
{
return head;
}
// 递归将 从下一节点开始的链表 反转
ListNode* newHead = reverseList(head->next);
// 处理当前节点,将当前节点接到 反转后链表 的尾部
ListNode* cur = head;
cur->next->next = cur;
cur->next = nullptr;
return newHead;
}
法2:迭代
通过 3 根指针 反转链表
ListNode* reverseList(ListNode* head) {
// base case
if (head == nullptr)
{
return nullptr;
}
ListNode* fast = head, * cur = head, * slow = nullptr;
while (fast != nullptr)
{
fast = fast->next; // 快指针先走一步
cur->next = slow; // 反转当前节点指针
slow = cur; // 慢指针跟着走
cur = fast;
}
return slow;
}