LeetCode算法入门 反转链表 解法与分析

本文详细介绍了如何通过迭代和递归方式实现单链表的反转。提供了清晰的代码示例,包括使用哑结点的递归方法和力扣官方的递归解法,适合初学者理解链表操作的基本原理。

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

问题描述:

反转一个单链表。

示例:

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

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

解法一:

扫描一遍,每扫描到一个节点,就将这个节点与下个节点的方向颠倒一下,扫描一遍之后就实现了反转。

代码如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode *current = head;//当前的节点
        ListNode *temp_next;
        ListNode *preview = NULL;//前边的节点
        while(current != NULL){            
            temp_next = current->next;
            current->next=preview;
            preview=current;
            current=temp_next;
        }
        return preview;
    }
};

自己画的原理图如下(太难看了,自己都看不下去了):

解法二:

把上面的代码修改成使用递归的方法。

可以加一个“哑结点”指向头结点。

代码如下:

ListNode* reverseList(ListNode* head) {
        if(!head){
            return nullptr;
        }
        return reverse(head, head, head->next);        
    }
    
    ListNode* reverse(ListNode* head, ListNode* first, ListNode* target){
        if(!target){
            return head;
        }
        first->next = target->next;
        ListNode* temp = target->next;
        target->next = head;
        return reverse(target, first, temp);
    }

这个递归代码参考大佬的:

作者:sunshy
链接:https://leetcode-cn.com/problems/two-sum/solution/die-dai-di-gui-jie-fa-by-sunshy/

解法三:

力扣官方的递归方法:

在这里插入图片描述

代码如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
    if (head == NULL || head->next == NULL) return head;
    ListNode *p = reverseList(head->next);
    head->next ->next = head;
    head->next = NULL;
    return p;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值