[LeetCode] 206. 反转链表(迭代、递归、链表)

206. 反转链表

反转一个单链表。

示例:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

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

解题思路: 此题虽然简单,但是是面试中常见的手撕代码题,而且关于链表的题,会涉及到指针,内存管理等等,面试官可以通过链表题牵引出内存管理、指针的知识,因此链表的题建议重点准备。此题题意要求提供两种解法,即迭代和递归,摘取代码注释中的题解。

提供迭代和递归两种方法:

  1. 迭代,附设一个前项节点pre,初始状态位NULL,然后遍历过程中将当前节点cur的next指向pre,然后cur指向下一个节点,pre移动cur节点。
  2. 递归,将head->next链表倒置,然后head->next恰好指向的是倒置链表的尾结点,将原链表头节点head移动到尾部完成头结点倒置,然后返回新的头结点。
// 提供迭代和递归两种方法:
// 1. 迭代,附设一个前项节点pre,初始状态位NULL,然后遍历过程中
// 将当前节点cur的next指向pre,然后cur指向下一个节点,pre移动cur节点
// Time: O(n),space:(1)
// 2. 递归,将head->next链表倒置,然后head->next恰好指向的是倒置链表的尾结点,
// 将原链表头节点head移动到尾部完成头结点倒置,然后返回新的头结点
// Time: O(n),space:O(n),i.e.,递归栈占辅助空间
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
#ifdef ITERATOR         
        if (!head || !head->next) return head;
        ListNode *pre = NULL, *cur = head, *next = NULL;
        while (cur) {
            next = cur->next;
            cur->next = pre;
            pre = cur;
            cur = next;
        }
        return pre;
#endif
// #ifdef RECURSION
        if (!head || !head->next) return head;
        ListNode *newNode = reverseList(head->next);
        head->next->next = head;
        head->next = NULL;
        return newNode;
// #endif
    }
};

你可能感兴趣的:(leetcode,链表)