IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> LeetCode 206 反转链表 -- 递归法和双指针法 -> 正文阅读

[数据结构与算法]LeetCode 206 反转链表 -- 递归法和双指针法

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-linked-list

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
?

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


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


示例 3:

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

提示:

链表中节点的数目范围是 [0, 5000]
-5000 <= Node.val <= 5000


思路:

最开始我自己的写法是使用递归的方法,核心代码(rListTail代表当前反转链表的尾节点):

reverse(rnNode.next);
rListTail.next = rnNode;
rListTail = rnNode;

在每次递归当中,先将当前节点的next节点作为递归函数的参数进行递归,生成当前的反转链表(即原链表在当前节点后面的节点反转得到的反转链表),然后再将当前反转链表的尾节点的next节点设为当前节点,最后再将当前节点作为当前反转链表的尾节点。

在这道题中出现了两次问题,一次是因为忘记将尾节点的next节点设为null,原链表的head节点最后变成反转链表的尾节点后,应该将它的next节点设为null,不过我在后边也修改成了在每次修改rListTail的值后将rListTail的next节点设为null。

另一个问题是要注意题目输入的链表有可能是空链表,这时候只要返回null就可以了。

递归法Java代码:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    private ListNode rListHead,rListTail;//分别表示当前反转链表的头节点和尾节点
    private void reverse(ListNode rnNode){
        if(rnNode == null){
            //这个时候传入的原始链表是空链表
            rListHead = null;
            return;
        }
        if(rnNode.next == null){
            //这时候意味着已经遍历到了原链表的尾节点,此时要将其设为当前反转链表的头节点和尾节点
            rListHead = rnNode;
            rListTail = rnNode;
            return;
        }
        reverse(rnNode.next);
        rListTail.next = rnNode;
        rListTail = rnNode;
        rListTail.next = null;//别忘了将当前反转链表尾部的next指针设为null
    }
    public ListNode reverseList(ListNode head) {
        reverse(head);
        return rListHead;
    }
}

另一种解法(双指针法):

参考文章:??????听说过两天反转链表又写不出来了?

看了参考文章后发现还可以使用双指针来做这道题,而且代码量也更少,也没有递归法抽象,更容易理解。

以下这个图很形象地展现了使用双指针的过程(图片转自代码随想录)

图片

?双指针法Java代码:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode reverseList(ListNode head) {
        ListNode pre = null, cur = head, tmp;
        while(cur != null){
            tmp = cur.next;
            cur.next = pre;
            pre = cur;
            cur = tmp;
        }
        return pre;
    }
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-01-12 00:15:37  更:2022-01-12 00:18:34 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 18:32:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码