每天一算:Reverse Linked List

作者: 五分钟学算法 | 来源:发表于2018-11-03 09:42 被阅读9次
    image

    LeetCode上第206号问题:Reverse Linked List

    题目

    反转一个单链表。

    示例:

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

    进阶:

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

    解题思路

    设置三个节点precurnext

    • (1)每次查看cur节点是否为NULL,如果是,则结束循环,获得结果
    • (2)如果cur节点不是为NULL,则先设置临时变量nextcur的下一个节点
    • (3)让cur的下一个节点变成指向pre,而后pre移动curcur移动到next
    • (4)重复(1)(2)(3)

    动画演示

    动画演示GIF有点大,请稍微等待一下加载显示_

    动画演示

    参考代码

    迭代的方式处理
    // 206. Reverse Linked List
    // https://leetcode.com/problems/reverse-linked-list/description/
    // 时间复杂度: O(n)
    // 空间复杂度: O(1)
    class Solution {
    public:
        ListNode* reverseList(ListNode* head) {
    
            ListNode* pre = NULL;
            ListNode* cur = head;
            while(cur != NULL){
                ListNode* next = cur->next;
                cur->next = pre;
                pre = cur;
                cur = next;
            }
    
            return pre;
        }
    };
    
    
    递归的方式处理
    // 206. Reverse Linked List
    // https://leetcode.com/problems/reverse-linked-list/description/
    //
    // 递归的方式反转链表
    // 时间复杂度: O(n)
    // 空间复杂度: O(1)
    class Solution {
    public:
        ListNode* reverseList(ListNode* head) {
    
            // 递归终止条件
            if(head == NULL || head->next == NULL)
                return head;
    
            ListNode* rhead = reverseList(head->next);
    
            // head->next此刻指向head后面的链表的尾节点
            // head->next->next = head把head节点放在了尾部
            head->next->next = head;
            head->next = NULL;
    
            return rhead;
        }
    };
    

    执行结果

    image

    敬请关注

    我们会在公众号(菠了个菜)上每天早上8点30分准时推送一条LeetCode上的算法题目,并给出该题目的动画解析以及参考答案,每篇文章阅读时长为五分钟左右。

    image

    相关文章

      网友评论

        本文标题:每天一算:Reverse Linked List

        本文链接:https://www.haomeiwen.com/subject/fvxkxqtx.html