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的指向
然后开始翻转
此时出现了一件事,也就是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;
}
}