Reverse Linked List(反转链表)

Reverse a singly linked list.(反转一个单链表)

Hint:
A linked list can be reversed either iteratively or recursively. Could you implement both?(反转链表可以通过迭代或递归实现)

1.个人解法(迭代)

ListNode* reverseList(ListNode* head)
    {
        if(!head)
            return NULL;

        ListNode *pre, *q, *tmp;
        pre = q = head;
        tmp = NULL;
        while(q)
        {
            tmp = q ->next;
            q ->next = pre;
            pre = q;
            q = tmp;
        }
        head ->next = NULL;
        head = pre;

        return head;
    }

2.参考解法(递归)

ListNode* reverseList2(ListNode* head)
    {
        if(head == NULL || head->next == NULL)
            return head;

        ListNode *p = reverseList2(head->next);
        head->next->next = head;
        head->next = NULL;

        return p;
    }

3.总结
第一种是循环迭代解法,时间和空间复杂度分别为O(n),O(1);第二种是递归解法,时间和空间复杂度分别为O(n),O(n)。递归的实现代码很简洁,但比迭代方法多了O(n)的隐性栈空间。虽然自己实现了迭代法,但没有成功实现递归法,说明自己对递归还没有一个清晰的认识。

PS:

  • 题目的中文翻译是本人所作,如有偏差敬请指正。
  • “个人分析”和“个人解法”均是本人最初的想法和做法,不一定是对的,只是作为一个对照和记录。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值