冲击大厂算法面试=>链表专题【链表反转之局部反转】

目录标题

反转链表II🤣局部反转

感觉会又有点不会!!!😢

上代码

java 复制代码
class Solution {
    public ListNode reverseBetween(ListNode head, int left, int right) {
        ListNode preHead = new ListNode(-1);
        preHead.next = head;
        ListNode cur = preHead; //使用前置节点移动,解决left=0的问题
        // 第一段移动 
        for (int i = 1; i < left; i++) {
            cur = cur.next;
        }
        ListNode node1 = cur; //思考node1含义
        printWithoutNull("node1=", node1);
        ListNode node2 = node1.next; //思考node2含义
        printWithoutNull("node2=", node2);

        // 继续移动 cur贯穿始终
        for (int i = 0; i <= right - left; i++) {
            cur = cur.next;
        }

        ListNode node3 = cur; //思考node3含义
        printWithoutNull("node3=", node3);
        ListNode node4 = node3.next; //思考node4含义
        printWithoutNull("node4=", node4);
        
        //找到每个node点后切断、反转、连接
        node1.next = null;
        node3.next = null;

        reverse(node2);
        
        node1.next = node3;
        node2.next = node4;

        return preHead.next;
    }

    //日志打印
    public void printWithoutNull(String prefix, ListNode node) {
        if (node == null) {
            System.out.println(prefix + "null");
        } else {
            System.out.println(prefix + node.val);
        }
    }

    //反转链表
    public ListNode reverse(ListNode head) {
        ListNode pre = null;
        ListNode cur = head;
        while (cur != null) {
            ListNode nextNode = cur.next;
            cur.next = pre;
            pre = cur;
            cur = nextNode;
        }
        return pre;
    }
}

题解呀

  • 因为头节点有可能发生变化,使用虚拟头节点可以避免复杂的分类讨论!
  • 思考node1、2、3、4 都是表示的哪些点,可以画一画!
  • 思考cur移动的过程
  • 理解 切断、反转、连接
dart 复制代码
比如:链表:1->2->3->4->5,我们虚拟头结点-1
执行代码时:node1=1、node2=2、node3=4、node4=5

然后从node1到node2断开,从node3到node4断开,这个时候变成了三段1、2->->3->4、5
然后翻转2->->3->4为4->3->2
最后再连接 1->4->3->2->5

实在不会的时候记住

时间复杂度:整个算法的时间复杂度为O(n),其中n是链表的长度。需要遍历链表两次,一次是找到left和right节点,一次是反转指定区间的链表。

空间复杂度:算法的空间复杂度为O(1),只使用了常数级别的额外空间。

有用的话就点个赞再走吧!

相关推荐
田梓燊19 分钟前
图论 八字码
c++·算法·图论
Tanecious.1 小时前
C语言--数据在内存中的存储
c语言·开发语言·算法
Bran_Liu1 小时前
【LeetCode 刷题】栈与队列-队列的应用
数据结构·python·算法·leetcode
好评笔记2 小时前
AIGC视频扩散模型新星:Video 版本的SD模型
论文阅读·深度学习·机器学习·计算机视觉·面试·aigc·transformer
kcarly2 小时前
知识图谱都有哪些常见算法
人工智能·算法·知识图谱
程序员小灰2 小时前
当了leader才发现,大厂最想裁掉的,不是上班总迟到的,也不是下班搞失联的,而是经常把这3句话挂在嘴边的!
面试
CM莫问2 小时前
<论文>用于大语言模型去偏的因果奖励机制
人工智能·深度学习·算法·语言模型·自然语言处理
程序猿零零漆2 小时前
《从入门到精通:蓝桥杯编程大赛知识点全攻略》(五)-数的三次方根、机器人跳跃问题、四平方和
java·算法·蓝桥杯
无限码力3 小时前
路灯照明问题
数据结构·算法·华为od·职场和发展·华为ode卷
嘻嘻哈哈樱桃3 小时前
前k个高频元素力扣--347
数据结构·算法·leetcode