解题思路
开辟一个新的链表结点作为头结点,首先先找到链表的第m、n个结点,用p、q记录下来,若p之前还存在结点,则先将前面的链表插到头结点之后,并且让tail移至前面部分的最后一个结点,之后p到q采用头插法插入链表中,当p移动到q->next时结束,此时再将tail移动到链表的末端,前面采用头插法时tail->next已置为NULL,已与p断开了,最后将原链表的剩余结点直接连接到新链表的末端,链表构造完成。
代码
class Solution {
public:
ListNode *reverseBetween(ListNode *head, int m, int n) {
if (head == NULL)
return NULL;
ListNode *first = new ListNode(0);
ListNode *tail = first;
ListNode *p = head;
ListNode *q = head;
bool flag = true;
while (--m){
p = p->next;
}
while (--n){
q = q->next;
}
if (p != head){//若p不为头部才需要这些操作的,否则不需要
tail->next = head;
while (tail->next != p){
tail = tail->next;
}
tail->next = NULL;
}
ListNode *q_n = q->next;
while (p != q_n){
ListNode *tmp = p->next;
p->next = tail->next;
tail->next = p;
p = tmp;
}
while (tail->next != NULL){
tail = tail->next;
}
if(p)
tail->next = p;
return first->next;
}
};