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 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 206. 反转链表 -> 正文阅读

[数据结构与算法]206. 反转链表

题目描述:

给你单链表的头节点 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
?

进阶:链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-linked-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

?

分析:

? ? ? ? 这道题让使用迭代和递归两种方法。

? ? ? ? 迭代思路应该好想一点,使用两个指针p1和p2,p1指向反转链表的头部,p2指向原链表的头部。p2从第二个节点依次后移,每当p2到达一个节点时,先记录下next=p2->next,然后断开p2与原链表的链接,把p2连接到p1前面,然后p1移动到新的反转链表头节点上,之后p2返回原链表,即p2=next,继续以上操作。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    // 迭代法
    ListNode* reverseList(ListNode* head) {
        if(head==NULL) return NULL;
        // p1指向新链表的头部
        ListNode *p1=head;
        // p2指向原链表的头部 初始情况下p1为新链表头部,故原链表头部可以理解为p1->next
        ListNode *p2=p1->next;
        // 遍历原链表
        while(p2!=NULL)
        {
            // 记录p2在原链表的下个节点
            ListNode *next=p2->next;
            // 把p2链接到p1前面,作为反转后链表的新的头节点
            p2->next=p1;
            if(p1==head)
            p1->next=NULL;
            // p1移动到到新的头节点上
            p1=p2;
            // p2移动到原链表下一位
            p2=next;
        }
        // 返回p1,即反转链表的头节点
        return p1;
    }
};

递归的方法,也容易想到。思路就是,对于当前节点head来说,使用递归函数f反转head->next之后的链表,然后把head挂到反转链表的最后一个节点即可。但是有个问题:递归函数返回的指针,究竟是应该指向反转链表的头节点,还是反转链表的尾节点?

? ? ? ? 1.如果递归函数返回的指针指向反转链表头节点,那么每次递归后,都要从反转链表的头节点开始遍历,遍历到反转链表尾部,然后挂上新的尾节点head,但是这样的话,每一次递归都要遍历,时间复杂度是显而易见的O(n^2),题目的范围又是5000,显然会超时。

? ? ? ? 2.如果递归函数返回的指针指向反转链表尾节点,那么把新的尾节点head挂到反转链表尾部就很容易,只需要直接链接即可。整个递归程序,时间复杂度为O(n)。看似很完美,但是也有个问题,整个反转链表构建完毕后,返回的是整个反转链表的尾节点,与题目要求不符。

? ? ? ? 我采用的是第二种方法,加了一些小小的改变,当递归程序查找到原链表最后一个节点时(即反转链表的头节点),使用一个全局变量记录下该节点,之后继续进行递归程序,直到反转链表构建完毕。最后返回该全局变量即可。

代码如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    // reversehead用来记录反转链表的头节点
    ListNode *reversehead=NULL;
    ListNode* reverseList(ListNode* head) {
       f(head);
       return reversehead;
    }
    // 函数f的功能,将当前头节点head,连接到反转后链表的最后一个位置 并返回反转链表的最后一个节点
    ListNode *f(ListNode* head)
    {
        
        if(head==NULL) return NULL;
        // 将head->next之后的链表反转,并返回最后一个节点
        ListNode *tail=f(head->next);
        // 如果head->next之后的链表反转后最后一个节点为空,说明head->next本身为NULL
        // 则head为原链表最后一个节点,也是反转链表的头节点
        if(tail==NULL)
        {
            // 记录下反转后链表的头节点
            reversehead=head;
            // 返回该节点
            return head;
        }
        // 反转链表尾部追加head节点,head节点成为反转链表最后一个节点
        tail->next=head;
        // 断开head和原链表的链接
        head->next=NULL;
        // 返回反转后链表的最后一个节点
        return head;
    }

};

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-24 00:48:42  更:2022-03-24 00:52:28 
 
开发: 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 11:57:41-

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