- 题目:
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL
- 解题思路:
只用将m到n之间的链表截取下来反转,再成链即可
ListNode* rev(ListNode* head) //反转链表
{
if(head == nullptr || head->next == nullptr)
return head;
ListNode* newhead = rev(head->next);
head->next->next = head;
head->next = nullptr;
return newhead;
}
ListNode* reverseBetween(ListNode* head, int m, int n) {
ListNode* newhead = new ListNode(0); //新建头节点,保证head节点的统一性
newhead->next = head; //成链
int n1 = 0;
ListNode* head1 = nullptr, *head2 = nullptr;
ListNode*p = newhead;
while(n1 < m-1){
n1++;
p = p->next;
}
head1 = p;
ListNode* q =head1->next; //反转链表的起始节点
while(n1 < n-1)
{
n1++;
p = p->next;
}
head2 = p->next->next; // 记录剩余节点的开头位置
p->next->next = nullptr; //反转链表断开
head1->next = rev(q); //前一部分与反转后链表相连
q->next = head2; //反转链表与后一部分相连
return newhead->next;
}
- 复杂度分析
时间复杂度:O(n)
空间复杂度:O(1)