当前位置 博文首页 > 数据结构和算法:LeetCode 92. 反转链表 II

    数据结构和算法:LeetCode 92. 反转链表 II

    作者:[db:作者] 时间:2021-07-29 12:41

    截止到目前我已经写了 500多道算法题,其中部分已经整理成了pdf文档,目前总共有1000多页(并且还会不断的增加),大家可以免费下载
    下载链接:https://pan.baidu.com/s/1hjwK0ZeRxYGB8lIkbKuQgQ
    提取码:6666

    在这里插入图片描述
    之前讲过链表的全部反转《432,剑指 Offer-反转链表的3种方式》,而这题只要求反转链表的部分节点,如果直接使用多个指针对需要反转的节点前后两两交换,也是可以解决的。

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    再来看下代码

    public ListNode reverseBetween(ListNode head, int m, int n) {
        //为了方便处理,先创建一个哑节点,让他指向head
        ListNode dummy = new ListNode(0);
        dummy.next = head;
    
        //记录开始反转节点的前一个节点
        ListNode pre = dummy;
        for (int i = 0; i < m - 1; i++) {
            pre = pre.next;
        }
        //记录开始反转的节点,我们把它后面需要反转的的节点
        //都移动到前面
        ListNode cur = pre.next;
    
        //采用头插法,把后面的节点都插入到前面
        for (int i = 0; i < n - m; i++) {
            ListNode next = cur.next;
            cur.next = next.next;
            next.next = pre.next;
            pre.next = next;
        }
        return dummy.next;
    }
    

    在这里插入图片描述

    cs