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.
There are 3 steps to solve this problem.
1. Find the node at position m and record the position ahead of m.
2. Start reversing nodes from m to n.
3. Concatenate node that recorded to the end of the reversal list and m node to n node's next.
C++ Code:
/*
* func: reverse_between
* goal: reverse nodes between m and n in the list
* @param head: head node of the list
* @param m: the starting index of reverse
* @param n: the end index of reverse
* return: new head of the linked list
*/
ListNode *reverse_between(ListNode *head, int m, int n){
//Argument validation
ListNode *iter = head;
int count = 0;
while(iter != nullptr){
++count;
iter = iter->next;
}
if(!(m <= n && n <= count && m >= 1)){
return head;
}
//Add one node to the current head to make it easiser
ListNode *tmp_head = new ListNode(0);
tmp_head->next = head;
ListNode *prev = tmp_head;
ListNode *curr = head;
//Make curr move to the start point of the reverse part
count = 1;
while(count < m){
prev = curr;
curr = curr->next;
++count;
}
//Record the nodes where reverse will happen
ListNode *starting = prev;
ListNode *ending = curr;
ListNode *next = nullptr;
//Start reversing
prev = curr;
curr = curr->next;
while(count < n){
next = curr->next;
curr->next = prev;
prev = curr;
curr = next;
++count;
}
//Concatenate the new head of the reversed part and end of the reversed part
starting->next = prev;
ending->next = curr;
head = tmp_head->next;
delete tmp_head;
return head;
}
Python Code:
# func: reverse a linked list from position m to n
# @param head: head node of the list
# @param m: starting position m
# @param n: ending position n
# @return: new head node
def reverse_between(head, m, n):
tmp_head = ListNode(0)
tmp_head.next = head
#Find position m
prev = tmp_head
count = 1
while count < m:
prev = prev.next
count += 1
start = prev
end = prev.next
#Start reversing
prev = prev.next
curr = prev.next
while count < n:
next = curr.next
curr.next = prev
prev = curr
curr = next
count += 1
start.next = prev
end.next = curr
return tmp_head.next
No comments:
Post a Comment