题目名称:92. Reverse Linked List II
题目难度:Medium
题目描述: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.
题目思路:
题目要求将一个给定的链表中的从位置m到位置n之间的节点反转。而且要在“原地”实现这个过程,也就是说,我们不能新建一个链表去存储这个给定的链表,再在存储的过程中对给定范围的节点做逆序处理。
那么只能原地玩弄节点的next指针了,遇到这种题目的一个思路就是“打桩”:即用一些辅助的位置来帮助我们实现这个过程。
比如此题,具体是思路是:维持三个指针,第一个指针指示反转范围的前一个节点;第二个指针指示当前要处理节点的前一个节点;第三个指针指示当前要处理的节点。
然后做一个循环,循环的次数是n - m,即需要反转的范围的长度 - 1.该循环主要做的工作是:将当前要处理的节点放在第一个指针的后面,然后将本来在第一个指针的后面的其他部分向后推一个单位。
这样,每一次循环,将在后面的一个要处理的节点放到前面,完成了该特定节点的反转。
最后的AC代码是:
/**
* 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 preHead(0);
preHead.next = head;
ListNode * start = &preHead;
n -= m;
while (--m) {
start = start->next;
}
ListNode * end = start->next;
while (n--) {
ListNode * temp = end->next;
end->next = temp->next;
temp->next = start->next;
start->next = temp;
}
return preHead.next;
}
};