LeetCode 206 反转链表 (Java 代码)

题目

反转一个单链表

图解

要理解单链表的反转,一定要画图!!!

初始状态:

在这里插入图片描述
第一步操作:让当前工作节点先保存好下一个节点,再指向前一个节点
在这里插入图片描述
第二步操作:更新 prev 和 curr 所代表的节点
在这里插入图片描述

文字解释

反转单链表包括以下几步:

  • 保存当前工作节点的下一个节点到nextTemp (保存下一个)
  • 将当前工作节点的指向为 prev节点(断开并指向之前一个)
  • 此时节点的指向已经反转了,将工作节点和prev标志的节点后移(更新工作节点和prev节点)

即有个 curr节点,专门处理当下节点的事情
有个 prev节点,表示的是上一个工作节点。
处理过程中,两个节点不断向后移动。

代码(Java)

    public ListNode reverseList(ListNode head) {
        ListNode prev = null;
        ListNode curr = head;
        while(curr != null){
            ListNode nextTemp = curr.next;
            curr.next = prev;
            prev = curr;
            curr = nextTemp;
        }
        return prev;
    }

以上的代码还可以使用递归的方式实现:

class Solution {
    public ListNode reverseList(ListNode head) {
        // 使用递归也能实现单链表的反转
        return helper(head, null);
    }

    public ListNode helper(ListNode curr, ListNode prev){
        if (curr == null) return prev;
        // 暂存下一个
        ListNode next = curr.next;
        // 更新指向
        curr.next = prev;
        // 移动 curr和 prev指向
        return helper(next, curr);
    }
}

链表的题目不懂就多画图

类似的题目:LeetCode 25 K 个一组翻转链表

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值