The idea is to find the m and n nodes, save the preNode before m, and afterNode after n… the tricky part is that define a newHead which next is original head, this could avoid if m == 0, the preNode is null… in this case, it always not null… at least is the newHead… more attend to reverse process.
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode reverseBetween(ListNode head, int m, int n) {
if(head == null){
return null;
}
ListNode newHead = new ListNode(Integer.MAX_VALUE);
newHead.next = head;
ListNode lastTail = newHead;
ListNode mHead = newHead.next;
ListNode nPlusNode = newHead.next;
ListNode lNode = head;
int i = 1;
while(i <= n){
if(lNode == null){
return null;
}
if(i == m - 1){
lastTail = lNode;
}
if(i == m){
mHead = lNode;
}
if(i == n){
nPlusNode = lNode.next;
lNode.next = null;
break;
}
lNode = lNode.next;
i++;
}
ListNode newMHead = reverseList(mHead);
lastTail.next = newMHead;
ListNode loop = newMHead;
while(loop.next != null){
loop = loop.next;
}
loop.next = nPlusNode;
return newHead.next;
}
private ListNode reverseList(ListNode node) {
if (node == null || node.next == null) {
return node;
}
ListNode newHead = new ListNode(node.val);
newHead.next = null;
ListNode lp = node.next;
while (lp != null) {
ListNode nextNode = lp.next;
lp.next = newHead;
newHead = lp;
lp = nextNode;
}
return newHead;
}
private ListNode reverse(ListNode head){
if(head == null || head.next == null){
return head;
}
ListNode newHead = new ListNode(Integer.MAX_VALUE);
newHead.next = head;
ListNode node = head.next;
head.next = null;
ListNode preNode = head;
while(node != null){
ListNode temp = node;
newHead.next = temp;
node = node.next;
temp.next = preNode;
preNode = temp;
}
return newHead.next;
}
}
没有评论:
发表评论