先找到链表中心节点,反转后半段,随后将后半段插入前半段。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
void reorderList(ListNode* head) {
ListNode *p=head,*q=head;
if(!q||!q->next)
return;
q=q->next;
q=q->next;
while(q)
{
p=p->next;
q=q->next;
if(q==NULL)
{
break;
p=p->next;
}
q=q->next;
}
ListNode *mid=p;
ListNode*move=mid->next;
ListNode *end=move;
int temp=1;
while(move)
{
if(temp)
{
temp--;
move=move->next;
}
else
{
end->next=move->next;
move->next=mid->next;
mid->next=move;
move=end->next;
}
}
ListNode* mov=mid->next;
ListNode *link=head;
mid->next=NULL;
while(mov)
{
ListNode *node=new ListNode(0);
node->val=mov->val;
node->next=link->next;
link->next=node;
mov=mov->next;
link=node->next;
}
}
};