虽然时间复杂度,空间复杂度都不怎么样,好歹是自己写出来的
ListNode* reverseBetween(ListNode* head, int left, int right) {
//创建头结点
//标记第n+1个结点
//标记第n个结点,并从n结点处断开
//标记第m个结点,以便后续的连接工作
//以m-1个结点为头结点,进行头插
//将剩下的结点连接到链表尾部(表尾是原来的m处)
if(head->next==nullptr||left==right)return head;
ListNode* Dummy=new ListNode();//头结点
Dummy->next=head;
ListNode* m=nullptr;
ListNode* n=nullptr;
ListNode* m_1=Dummy;
ListNode* n_1=nullptr;//m_1是m-1,n_1是n+1;
int k=left;
while(k-1!=0){
m_1=m_1->next;
k--;
}
m=m_1->next;//m_1是待翻转链表的头结点,m是链表反转后的尾结点
n=m;
while(right!=left){
n=n->next;
right--;
}
n_1=n->next;//n是待翻转链表的尾结点,n_1是后序链表的头结点
n->next=nullptr;//断开
//初始化完毕,开始翻转
m_1=reverse(m_1);
//将翻转后的链表和尾巴连起来
m->next=n_1;
return Dummy->next ;
}
ListNode* reverse(ListNode* head){//头插法翻转
ListNode* p=nullptr;
ListNode* q=nullptr;
p=head->next;
head->next=nullptr;
while(p!=nullptr){
q=p->next;
p->next=head->next;
head->next=p;
p=q;
}
return head;
}