思想:1、两个指针(快慢指针)找到中间位置,将链表分为两部分。
2、将后半部分逆序
3、将后半部分插入到前半部分空位处
void reorderList(ListNode* head) {
if(head==NULL || head->next==NULL)
{
return;
}
ListNode *slow = head;
ListNode *fast = head;
while(fast->next && fast->next->next)
{
slow = slow->next;
fast = fast->next->next;
}
ListNode* needReserve = slow->next;
slow->next = NULL;
needReserve = reserve(needReserve);
ListNode *pCur = head;
while(pCur && needReserve)
{
ListNode *cursecond = needReserve;
needReserve = needReserve->next;
ListNode *nextCur = pCur->next;
cursecond->next = pCur->next;
pCur->next = cursecond;
pCur = nextCur;
}
}
ListNode* reserve(ListNode* head)
{
ListNode* p1 = NULL;
ListNode* p2 = head;
ListNode* p3 = p2;
while(p2)
{
p3 = p2->next;
p2->next = p1;
p1 = p2;
p2 = p3;
}
return p1;
}