题目描述如下:
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL
很明显这个题目是206 反转链表的进阶版
需要记录第m-1个节点和第n+1个节点,因为这两个节点分别是当前链表逆置区域的头节点和尾节点,总体分为三步
- 获取逆置区域的头节点,即第m -1 个节点
- 逆置m – n个节点
- 获取第 n + 1个节点
- 链接逆置后区域的头部和尾部
实现如下:
ListNode* reverseBetween(ListNode* head, int m, int n) {
int change = n - m + 1;
ListNode *pre_head = NULL;
ListNode *result = head;
while(head && --m) {
pre_head = head;
head = head -> next;
}
ListNode *list_tail = head;
ListNode *new_head = NULL;
while(change && head) {
ListNode *p = head -> next;
head -> next = new_head;
new_head = head;
head = p;
change --;
}
list_tail -> next = head;
if (pre_head) {
pre_head->next = new_head;
} else {
result = new_head;
}
return result;
}