92.反转链表II

题目

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

输入:head = [1,2,3,4,5], left = 2, right = 4
输出:[1,4,3,2,5]

示例 2:

输入:head = [5], left = 1, right = 1
输出:[5]
 
提示:
链表中节点数目为 n
1 <= n <= 500
-500 <= Node.val <= 500
1 <= left <= right <= n

代码

和反转整个链表不同的是:
(1)需要记录反转区域的前一个节点ll。记反转区域的头节点为head,最后只要ll.next=head连接前后两部分即可。因为有可能从第一个节点就开始反转,所以引入哑元dummy。
(2)控制反转次数,反转到right位置结束。使用for循环即可。

  public ListNode reverseBetween(ListNode head, int left, int right) {
        //ll为第left-1个节点
        ListNode dummy=new ListNode(),ll=dummy;
        dummy.next=head;
        for(int i=1;i<left;++i) ll=ll.next;
        //反转[left,right]区域
        head=ll.next;
        ListNode pre=head,cur=head.next;
        for(int i=left;i<right;++i){
            pre.next=cur.next;
            cur.next=head;
            head=cur;
            cur=pre.next;
        }
        //和前面的部分接上
        ll.next=head;
        return dummy.next;
  }

leetcode原题:92.反转链表II

原文地址:https://www.cnblogs.com/Frank-Hong/p/14671065.html