题解 | #链表内指定区间反转#
链表内指定区间反转
http://www.nowcoder.com/practice/b58434e200a648c589ca2063f1faf58c
双链表法
区间内反转采用双链表法,与全体翻转不同的是,pre初始应指向区间右侧下一个结点,且翻转完成后,区间左侧前一个结点应指向pre。所以先遍历一遍链表,对指针遍历初始化。最后注意区间边界是开头和结尾的情况即可。
C++代码:
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int m, int n) {
ListNode *l, *pre, *p, *t = head;
for (int i = 1; i <= n + 1; i++) {
if (i == m - 1) {l = t;}
if (i == m) {p = t;}
if (i == n + 1) {pre = t;}
if (t == NULL) break;//注意n为链表长度时,不跳出下一步会段错误。
t = t->next;
}
for (int i = m; i <= n; i++) {
t = p->next;
p->next = pre;
pre = p;
p = t;
}
if (m != 1) {l->next = pre;}
else {head = pre;}//注意左边界
return head;
}
};