给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表。

力扣原题:

 先贴代码:

public class Solution92 {
    public ListNode reverseBetween(ListNode head, int left, int right) {
        //创建一个虚拟头节点以处理需要反转的节点是头节点的情况
        ListNode newhead = new ListNode(-1);
        newhead.next = head;
        //创建cur节点使其指向left节点的前一个节点
        ListNode cur = newhead;
        for (int i = 0; i < left-1; i++) {
            cur = cur.next;
        }
        //创建ret节点指向cur节点的next节点,即left节点
        ListNode ret = cur.next;
        //开始遍历链表,将left节点的后继节点移到cur节点之后
        for (int i = 0; i < right-left; i++) {
            ListNode retNext = ret.next;
            ListNode curNext = cur.next;
            cur.next = retNext;
            ret.next = retNext.next;
            retNext.next = curNext;
        }
        //返回虚拟头节点的后继节点
        return newhead.next;
    }
}

思路分析

题目中告诉我们,要求将链表中位置left到位置right之间的链表进行反转操作;例如left设为2,right设为4,那么意思如下图演示:

首先我们遇到这题解题时首先想到的反转方法应该是将位置为left节点(后简称为left节点)的前驱节点指向位置为right节点(后简称为right节点),再将left节点指向right节点的后继节点,然后再分别将这条链表内各节点的指向更改为前一个节点。但是这个方法未免过于复杂冗余,需要找到left节点和right节点,并且再进行遍历将链表中每个节点的指向更改。

我们在平时生活中肯定遇到过插队现象:每一个人都想往前面插,这样来一个人插一次队来一个人插一次队,慢慢的最前面的人就被挤到后面去了,这一题的解法也是类似的;

将在left位置后面的每一个节点都插入队伍的最前面,直至left节点成为最后一个节点(这里最后一个节点指的是这一条需要反转的链表的最后一个节点,并非一整条链表的最后一个;队伍的最前面也同理,是指需要反转的链表的最前面),这样我们只需要一次遍历链表就完成了反转链表的操作。具体操作如下图:

 

这里为了处理头节点也需要反转的情况,引入了一个虚拟头节点,方便解题:

 然后创建cur节点使其指向left节点的前驱节点:

 之后开始遍历链表:

 最后返回新建的虚拟头节点的next节点:

 

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值