leetcode刷题-206.反转链表

题目:

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。要求是不能申请额外的内存空间。

示例 1:

输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]

思路分析:

如果定义一个新链表实现链表元素的反转,会对内存造成浪费。所以不使用这种方法,只需要改变链表next指针的指向,直接将链表进行反转就可以。

方法1:双指针法。

        定义一个cur指针,指向头节点,定义一个pre指针,初始指向null,使用头插法。

        我们使用temp指针来保存cur.next,也就是下一个要处理的节点,使用头插法cur.next指向pre,然后更新pre和cur指针。

代码如下:

class Solution {
    public ListNode reverseList(ListNode head) {
        ListNode temp;
        ListNode pre = null;
        ListNode cur = head;
        while (cur != null) {
            // 保存下一个节点,因为接下来要改变cur.next
            temp = cur.next; 
            cur.next = pre; //头插
            pre = cur; //更新pre指针
            cur = temp;//更新cur指针,处理下一个节点
        }
        return pre;
    }
}

        最后,cur指针指向null,循环结束,链表反转结束,此时,pre指针指向了新的头节点,返回pre即可。

方法2:递归法。

        递归方法和方法一实际上没啥区别。直接看代码吧。

class Solution {
    public ListNode reverseList(ListNode head) {
        return reverse(null, head);
    }

    public ListNode reverse(ListNode pre, ListNode cur) {
        if (cur == null) {
            return pre;
        }
        ListNode temp = cur.next;
        cur.next = pre;
        return reverse(cur, temp);
    }
}

        OK!我们来看一下,定义一个reverse函数,用来就是反转的,与方法1相比其实就是将更新pre和cur节点省去了,使用递归来完成。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

开心码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值