# 92 Reverse Linked List II

Description

Given the head of a singly linked list and two integers left and right where left <= right, reverse the nodes of the list from position left to position right, and return the reversed list.

Examples

Example 1:
在这里插入图片描述

Input: head = [1,2,3,4,5], left = 2, right = 4
Output: [1,4,3,2,5]

Example 2:

Input: head = [5], left = 1, right = 1
Output: [5]

Constraints:

The number of nodes in the list is n.
1 <= n <= 500
-500 <= Node.val <= 500
1 <= left <= right <= n

思路

看图说话,以example1为例,要翻转234
在这里插入图片描述
先设置三个pointer,其中

  • pointer1指向left-1,用于点名翻转的起始位置(由于pointer1是left-1,所以在header前也要设置一个空ListNode)
  • pointer2指向right,用于判断是否到达翻转终点
  • pointer3指向right+1,用于点名翻转list的指向

然后开始翻转
给出两个新的pointer
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
此时出现了一件事,也就是curretPointer = pointer2,意味着翻转到达了终点,现在要进行的是把pointer1指向pointer2,同时进行之前的currentPointer / nextPointer / pointer3的互换操作
在这里插入图片描述
这样拉平,也就是
在这里插入图片描述

代码

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode reverseBetween(ListNode head, int left, int right) {
        if(left == right)
            return head;
        
        ListNode pointer1 = new ListNode(1);
        ListNode pointer2 = new ListNode(1);
        pointer1.next = head;
        pointer2.next = head;
        head = pointer1;
        
        right++;
        left++;
        
        int current = 1;
        
        while(current < left - 1){
            pointer1 = pointer1.next;
            pointer2 = pointer2.next;
            current ++;
        }
        
        while(current < right){
            pointer2 = pointer2.next;
            current ++;
        }
        
        ListNode pointer3 = pointer2.next;
        ListNode currentPointer = pointer1.next;
        ListNode nextPointer = currentPointer.next;
        
        while(currentPointer != pointer2){
            currentPointer.next = pointer3;
            pointer3 = currentPointer;
            currentPointer = nextPointer;
            nextPointer = nextPointer.next;
        }
        
        currentPointer.next = pointer3;
        pointer1.next = currentPointer;
        
        return head.next;
        
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值