day4-反转链表

反转链表

力扣题目链接

题目描述

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

思路

面试常考的题型,这里带来两种做法,一种双指针,一种迭代法。

双指针法

第一次看到题目时,我第一时间想到的是,先从第一个结点找到最后一个,然后再依次翻转。但是这样的时间复杂度就是O(2n)了。

为什么不能第一次遍历的时候就处理好所有翻转呢?定义两个指针

  • pre:指向当前结点的前一个结点
  • cur:指向当前结点

这样这需要一对对处理即可,难点在于如何进行结点的更替。

代码如下:

c 复制代码
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
       ListNode* tmp;
       ListNode* cur = head;
       ListNode* pre = nullptr; //头节点的pre指向null

       while(cur){
            tmp = cur->next; //保存cur的下一个结点,因为下一步要修改
            cur->next = pre;
            //update
            pre = cur; // 更新结点,从后往前更新
            cur = tmp;
       }
       return pre;
    }
};
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

迭代法

迭代法的本质思路其实跟双指针是一样的,不同点在于使用了n栈的空间。

如果可以理解双指针,理解迭代法应该是更加轻松才对。

代码如下:

c 复制代码
 ListNode* reverseList(ListNode* head) {
        return reverse(nullptr,head);
    }
    ListNode* reverse(ListNode* pre, ListNode* cur)
    {
        if(cur == nullptr)return pre; //终止条件
        ListNode* tmp = cur->next;
        cur->next = pre;
        return reverse(cur,tmp);
    }
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)
相关推荐
wabs6667 小时前
关于图论【卡码网117.软件构建的思考】
数据结构·算法·软件构建·图论·卡码网
Tongzhi20268 小时前
从部署到运维:通芝科技无感考勤一体机的全流程效率解析
运维·数据结构·科技·算法·贪心算法
小玮看世界13 小时前
[Python]线段树与二分法
数据结构·算法
青山木17 小时前
Hot 100 --- 在排序数组中查找元素的第一个和最后一个位置
java·数据结构·算法·leetcode
依然鸣18 小时前
PTA团体程序设计天梯赛L2真题讲解L2-045-048
数据结构·c++·经验分享·学习·算法·pat考试·pat
CQU_JIAKE19 小时前
8.5【A】
数据结构·算法
Jasmine_llq20 小时前
《P13016 [GESP202506 六级] 最大因数》
数据结构·算法
白狐_79820 小时前
考研408算法设计题保命策略:链表专题暴力解法精讲(2015 & 2019真题实战)
考研·算法·链表
凉茶钱1 天前
【数据结构】C语言实现队列
c语言·数据结构
zander2581 天前
34. 在排序数组中查找元素的第一个和最后一个位置:用两个边界定位区间
数据结构·算法·leetcode