LeetCode92.反转链表Ⅱ

题目描述

在这里插入图片描述

思路

与反转链表略有不同,此题要求反转区间内的链表,其实总体思路和反转全链表是差不多的,不过因为是区间内反转,指针指向稍微要复杂一些。可以通过画图来理解整个过程。

方法一:双指针反转

借用leetcode评论区dalao的一张图,通过图解可以理解整个过程
在这里插入图片描述
代码如下:

class Solution {
    public ListNode reverseBetween(ListNode head, int left, int right) {
    	//定义一个虚拟头结点,方便处理
        ListNode dummy = new ListNode(0);
        dummy.next = head;
        ListNode hh = dummy;
        //找到left的前驱节点
        for(int i = 1;i < left;i++) {
            hh = hh.next;
        }

        ListNode a = hh.next;
        ListNode b = a.next;

        int k = right - left;
        //对left到right位置的节点进行反转
        while(k-- > 0) {
            ListNode temp = b.next;
            b.next = a;
            a = b;
            b = temp;
        }

        //将left前驱节点指向right节点
        hh.next.next = b;
        //将left节点指向最后一个节点
        hh.next = a;
        return dummy.next;
    }
}

方法二:头插法反转

头插法就是每次反转时通过改变指针方向,将当前节点的下一个节点插入到当前节点的前面,实现反转。同样地,借用leetcode评论区dalao的一张图,通过图解可以理解整个过程
在这里插入图片描述
在这里插入图片描述
代码如下:

class Solution {
    public ListNode reverseBetween(ListNode head, int left, int right) {
    	//定义一个虚拟头结点,方便处理
        ListNode dummy = new ListNode(0);
        dummy.next = head;

        ListNode hh = dummy;
        //找到left的前驱节点
        for(int i = 1;i < left;i++) {
            hh = hh.next;
        }

        //找到left节点
        ListNode a = hh.next;
        int k = right - left;
        //使用头插法,每次循环将后一个节点插入到当前节点的前面
        while(k-- > 0) {
            ListNode temp = a.next;
            a.next = a.next.next;
            temp.next = hh.next;
            hh.next = temp;
        }
        return dummy.next;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值