Reverse a linked list from position m to n. Do it in-place and in one-pass.
For example:
Given 1->2->3->4->5->NULL
, m = 2 and n = 4,
return 1->4->3->2->5->NULL
.
Note:
Given m, n satisfy the following condition:
1 ≤ m ≤ n ≤ length of list.
Goal: reverse LinkNodes in range between m & n;
Solution_1:
Idea: easy to Implement if you fully understand the problem of Reverse Linked List
This is just a extension.
Use 3 addition nodes:
Prev: point to position of m-1
begin: point to position of m
end: point to position of n
call reverse function from Reverse Linked List by pass
reverse(prev, end.next);
public ListNode reverseBetween(ListNode head, int m, int n) {
if(head==null | head.next==null) return head;
ListNode dummy=new ListNode(0);
dummy.next=head;
ListNode prev=dummy;
ListNode begin=head;
while(m>1){
prev=begin;
begin=begin.next;
m--;
}
ListNode end=head;
while(n>1){
end=end.next;
n--;
}
reverse(prev,end.next);
return dummy.next;
}
private ListNode reverse(ListNode dummy,ListNode afterend){
ListNode prev=dummy;
ListNode cur=dummy.next;
ListNode nextNode=cur.next;
while(nextNode!=afterend){
cur.next=nextNode.next;
nextNode.next=prev.next;
prev.next=nextNode;
nextNode=cur.next;
}
return dummy.next;
}
Solution_2:
Key to solve:
Find 4 additional node as well, prevDummy, nextDummy, beign and end
prevDummy: connect with begin
beign: connect with end
nextDummy: store connection for end.next
end: connect with begin
In case of Given 1->2->3->4->5->NULL, m = 2 and n = 4,
beign node: 2; end node 4;
then reverse node using iterating methond of while loop
loop 1: 1->3->4->2->5->NULL
loop 2: 1->4->3->2->5->NULL
until beign==end, excit loop
public ListNode reverseBetween(ListNode head, int m, int n) {
if(head==null || head.next==null) return head;
ListNode prevDummy=new ListNode(0);
prevDummy.next=head;
ListNode nextDummy;
ListNode begin=head;
for (int i=1;i<m;i++) {
prevDummy=begin;
begin=begin.next;
}
ListNode end=head;
for(int j=1;j<n;j++){
end=end.next;
}
while(begin!=end){
//save end.next into nextDummy node
nextDummy=end.next;
//move reverse node after end node
end.next=begin;
//connect to next node
prevDummy.next=begin.next;
//connect to right most portion
begin.next=nextDummy;
//connect to left most portion
begin=prevDummy.next;
}
//becareful: in case of reverse from begin to n =>m==1
if(m==1) return prevDummy.next;
else return head;
}