反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4 输出: 1->4->3->2->5->NULL
解题思路:
1.方便起见创建一个新的结点head1指向初始的表头。
2.*p从head1开始,往后移动m-1个位置。(题目中明确1 ≤ m ≤ n ≤ 链表长度,不必考虑溢出问题)
3.新建结点head2作为表头,将p结点之后的m-n+1个元素依次插入head2之后。
4. 将得到的新链表插入原来的表中。
注意,步骤1-4只用了额外的两个结点空间,仅扫描一次(严格来说大部分都不需要一次,只有完全反转链表时才有1趟扫描)。
class Solution { public: ListNode* reverseBetween(ListNode* head, int m, int n) { if (head == NULL || head->next == NULL) return head; ListNode* head1 = new ListNode(0); head1->next = head; ListNode* p = head1; //将p后移m-1个单位 int sgn = n - m + 1; while (m - 1) { p = p->next; m--; } ListNode* q = p->next, *last = q; //将之后的sgn个元素插入head2的表头 ListNode* head2 = new ListNode(0),*temp; while (sgn) { temp = q->next; q->next = head2->next; head2->next = q; q = temp; p->next = temp; sgn--; } temp = p->next; p->next = head2->next; last->next = temp; return head1->next; } }; |