反转链表的两种迭代解法和一种递归解法(Java)

本文详细介绍了三种常见的链表反转方法,包括迭代法的遍历法和头插法,以及递归解法。这些方法分别利用不同指针策略实现链表节点的反转,时间复杂度均为O(n),空间复杂度分别为O(1)和O(n)。通过实例代码展示了每种方法的具体实现,帮助读者深入理解链表操作。

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

原题链接
在这里插入图片描述在这里插入图片描述最常考的链表题型

迭代法本质都类似,都用指针保留了结点信息。都使用了3个指针,这是因为在改变next域后,原结点的后继位置将丢失。

  • 迭代解答1遍历法(时间O(n) 空间O(1))
class Solution {
    public ListNode reverseList(ListNode head) {
        //定义三个指针 prev cur curNext 其中cur是用于反转的结点 prev是cur的前驱 
        //但cur的next的指向改变后 原cur的后继的位置会丢失 所以采用了curNext记录cur的位置
        ListNode cur = head;
        ListNode prev = null;
        ListNode curNext = null;
        while (cur != null) {
            curNext = cur.next;
            cur.next = prev;
            prev = cur;
            cur = curNext;
        }
        return prev;
    }
}

在这里插入图片描述

  • 迭代解法2 头插法(时间O(n) 空间O(1))
class Solution {
    public ListNode reverseList(ListNode head) {
        //头插法只需两个临时指针 相对容易理解
        //cur是当前要反转的结点 curNext存储cur的后继
        //每次先存储curNext   再让cur的next域指向head(头插) cur赋给head curNext赋给cur 
        if (head == null) return null; //头插法必须保证head结点不是空
        ListNode cur = head.next;
        head.next = null;//防止链表出现环
        while (cur != null) {
            ListNode curNext = cur.next;
            cur.next = head;
            head = cur;
            cur = curNext;
        }
        return head;
    }
}

递归相对迭代更难理解

  • 进阶递归解法(时间O(n) 空间O(n))
class Solution {
    public ListNode reverseList(ListNode head) {
        //递归反转单链表 思路是:把问题化成性质相同的子问题 反转一个链表 等于反转以头结点的next为头的链表(如果不为null)
        //在把头结点的next结点指向头
        if (head == null || head.next == null) return head;
        ListNode ret = reverseList(head.next);//所有的反转链表都拥有用一个尾 所以采用了返回值传递的方式
        head.next.next = head;
        head.next = null;
        return ret;
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值