leetcode刷题206. 反转链表(Java)递归&迭代&双指针

本文详细介绍了LeetCode第206题——反转链表的解题思路,包括递归、迭代和双指针三种方法。通过实例和代码解释了每种方法的实现细节,帮助读者理解和掌握链表操作技巧。

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

1. 题目描述

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
示例1:
示例1

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

示例2:
示例2

输入: head = [1,2]
输出: [2,1]

示例3:

输入: head = []
输出: []

2. 解法

2.1 递归

今天的递归也是一看就会,一写就废呢。

递归都是和动态规划中的状态转移方程一样,就是先处理头节点,剩下的一部分放进函数递归。
所以我这里只讲三个点,比较容易理解一点。
换位置需要起码两个点,所以递归到倒数最后一个点就可以直接返回。
先5和4换位置(暂定1->2->3->4->5这样的链表)
return 之后3还是指向4,需要先将4指向3(其实到这一步已经完成了转向)
但是要把3->null不然会形成环,链表形成环就容易死循环。
递归

class Solution {
    public ListNode reverseList(ListNode head) {
        if(head==null||head.next==null){
            return head;
        }
        ListNode newHead = reverseList(head.next);
        head.next.next = head;
        head.next = null;
        return newHead;
    }
}

2.2 迭代

我的思路是这样的,首先要有一个新的头节点,然后进入循环,用temp节点储存第二节点。然后将head->next接在prev->next,再将prev->next指向head。最后有一个新的head进入循环。可以看下图(本来应该是动图,但是我不太会画,就凑活看,还是很清楚的,temp应该只是一个指针,没有框,画的时候忘了)
迭代图示
Java代码如下:

class Solution {
    public ListNode reverseList(ListNode head) {
        ListNode preserve = new ListNode(-1);
        ListNode prev = preserve;
        while(head != null){
            ListNode temp = head.next;
            head.next = prev.next;
            prev.next = head;
            head = temp;
        }
        return prev.next;
    }
}

2.3 双指针

双指针我懒得画图了,可以试试自己画,链表画图会直观很多。
比如1->2->3->4->5这样的链表,假设cur指向1前面的null,pre指向1.
此时只需要将1->cur,pre->2,cur->1就行。
其中因为2会没有指针,会找不到,所以用一个temp指针存住。

class Solution {
    public ListNode reverseList(ListNode head) {
        ListNode cur = null,pre = head;
        while(pre!=null){
            ListNode temp = pre.next;
            pre.next = cur;
            cur = pre;
            pre = temp;
        }
        return cur;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值