[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
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值