Leetcode 206:反转链表

本文详细解析LeetCode 206题:反转链表的多种解法,包括使用map存储、后值前插法、迭代法及递归法,旨在帮助读者深入理解链表操作与算法思维。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

反转一个单链表。

示例:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?

我的解法一:用map做临时存储

两次循环,第一次把链表中的数据存储到map里,第二次倒序遍历map的key值,存进链表。

    ListNode* reverseList(ListNode* head) {
        map<int, int> m;
        int i = 0;
        ListNode* p = head;
        while(p != NULL)
        {
            m[i++] = p->val;
            p = p->next;
        }
        p = head;
        while(p != NULL)
        {
            p->val = m[--i];
            p = p->next;
        }        
        return head;

我的解法二:后值前插法(我起的名字)

具体操作是遍历链表,第一步先把链表头指针即第一个节点next指向第三个节点,再把第二个节点的next指向第一个节点。再对第三个节点执行相同操作。以此类推,直到head->next为NULL。

    ListNode* reverseList(ListNode* head) {
        if(head == NULL){return head;}
        ListNode* p = head;
        ListNode* q = head->next;
        while(head->next != NULL)
        {
            q = head->next;
            head->next = q->next;
            q->next = p;
            p = q;
        }
        return p;
    }

迭代法

相当于是我的解法之上的升级版,除了进行head->next 指向NULL操作之外,第一步是把第二个节点指针指向第一个节点再以此类推,而省去了第一个节点指向第三个节点的过程(因为第三个节点用一个新节点指针定义了,不会出现找不到的问题)

        ListNode* newhead = NULL;
        while(head != NULL)
        {
            ListNode* t = head->next;
            head->next = newhead;
            newhead = head;
            head = t;
        }
        return newhead;
    }

递归法

    ListNode* reverseList(ListNode* head) {
        if(!head || !head->next){return head;}
        ListNode* newHead = reverseList(head->next);
        head->next->next = head;
        head->next = NULL;
        return newHead;
    }

不好理解?把一层层的嵌套展开,写一个伪码方便理解:

/*
 * for example
 * 1->2->3->4->NULL
*/

ListNode* reverseList(ListNode* head) {
        if (!head || !head->next) return head;  // 1
		
        //ListNode *newHead = reverseList(head->next);  // 1
		if (!head2 || !head2->next) return head2;  // 2
		
        //ListNode *newHead = reverseList(head->next);  //2
		if (!head3 || !head3->next) return head3;  // 3
		
		//ListNode *newHead = reverseList(head->next);  //3
		if (!head4 || !head4->next) return head4;  // The last
		
        head3->next->next = head3;  //3
        head3->next = NULL;  //3
        return newHead;  //3
		
        head2->next->next = head2;  //2
        head2->next = NULL;  //2
        return newHead;  //2
		
        head->next->next = head;  // 1
        head->next = NULL;  // 1
        return newHead;  // 1
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值