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.
这个题是局部reverse,需要注意m=1, n=1 和m和n都为最后一个元素的特殊情况。遍历链表,找出需要翻转的begin_node, end_node, post_node 和 pre_node.为了应对链表头,则需要加一个dummy_node. 需要注意最后返回的应该是dummy_node的next,而不是诸如head
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int m, int n) {
ListNode* dummyNode = new ListNode(0);
dummyNode->next = head;
ListNode* prev_node = dummyNode;
ListNode* post_node = NULL;
ListNode* begin_node = NULL;
ListNode* end_node = NULL;
ListNode* node = head;
int num = 1;
while (1) {
if (m - 1 == num) {
prev_node = node;
}
if (m == num) {
begin_node = node;
}
if (n == num) {
end_node = node;
post_node = node->next;
break;
}
num++;
node = node->next;
}
end_node->next = NULL;
ListNode* prev = NULL;
node = begin_node;
while (node != NULL) {
ListNode* tmp = node->next;
node->next = prev;
prev = node;
node = tmp;
}
prev_node->next = prev;
begin_node->next = post_node;
return dummyNode->next;
}
};