链表反转全家桶(一):动画详解单链表反转

单链表的反转是一个easy级别的题目,这个题目在力扣上的提交次数达到47万次,而且在面试中也频频出现,可谓是大受欢迎,它的兄弟们也跟着风光了。这道题本身是比较简单的,而它的“难兄难弟”就不是那么简单了。今天这篇文章先从简单开始,分析单链表的反转。

题目描述如下。

反转一个单链表。

示例:

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

方法一:双指针迭代
迭代法在于,在遍历链表的过程中逐个改变链表节点的指向,重点在于在改变节点指向的同时,不使链表产生断链。我们可以使用两个变量precur来表示当前访问到的节点和前一个节点,要使cur.next = pre,为了能使链表继续向前迭代,我们还需要提前记录当前节点的下一个节点,并把下个节点赋值给cur变量。
动画演示如下。
在这里插入图片描述

class Solution {
   
    public ListNode reverseList(ListNode head) {
   
        if (head == null || head.next == null) {
   
            return head;
        }
        ListNode pre = null, cur = head;
        while (cur != null) {
   
            ListNode node = cur.next;
            cur.next = pre;
            pre = cur;
            cur = node;
        }
        return pre;
    }
}

复杂度分析

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

方法二:递归
递归是个神奇的存在,那么简单,又那么复杂,有时觉得它很近,实际上它却那么远,有时觉得重新认识了它,可它还是那个它,从未改变过。每一次使用递归,都会对它理解更深一点。

递归法解决链表反转在于假设已经反转好链表的其他节点,当前节点怎么处理。假设链表为
N 1 → N 2 → . . . → N k → N k + 1 → . . . → N n N_1 \rightarrow N2 \rightarrow ... \rightarrow N_k \rightarrow N_{k+1} \rightarrow ... \rightarrow N_n N1

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值