92. Reverse Linked List II (翻转链表II)
1. 题目翻译
将给定链表的位置m到n之间的结点翻转。要求原地操作,并且只能遍历一次。假设1 ≤ m ≤ n ≤ 链表长度
例子:
Given 1->2->3->4->5->NULL, m = 2 and n = 4,
return 1->4->3->2->5->NULL
2. 解题方法
首先找到第m个结点的前驱,然后按照206. Reverse Linked List翻转链表的操作,将m到n之间的结点翻转。需要考虑到头结点需要被翻转,为了避免分类讨论,创建一个指向头结点的flag结点,以简化操作。
3. 代码
//Runtime: 3ms
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int m, int n) {
if(!head)
return head;
ListNode* flag = new ListNode(0);
flag->next = head;
int i = 1;
ListNode* p = flag;
while(p&&i<m){
p = p->next;
i++;
}
ListNode* q = p->next;
i = 0;
while(i<n-m){
ListNode* temp = p->next;
p->next = q->next;
q->next = q->next->next;
p->next->next = temp;
i++;
}
return flag->next;
}
};