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.
细心一点,直接挪。
关键点有四个,1.第m-1个点,2.第m个点,3.第n个点,4.第n+1个点。
/**
* 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) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
ListNode *before, *start, *end, *after;
before = after = start = end = NULL;
ListNode *ptr = head;
for (int i = 1; i < m; i++) {
before = ptr;
ptr = ptr->next;
}
start = end = ptr;
for (int i = m; i <= n; i++) {
after = ptr->next;
ptr->next = end;
end = ptr;
ptr = after;
}
if (before == NULL) {
head = end;
}
else {
before->next = end;
}
start->next = after;
return head;
}
};
本文详细阐述了如何在不使用额外空间的情况下,一次遍历链表,实现从位置m到n的区间反转。
554

被折叠的 条评论
为什么被折叠?



