LeetCode~重排链表

思想: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;
    }

猜你喜欢

转载自blog.csdn.net/weixin_40822052/article/details/90056985