Reorder List

Given a singly linked list L: L0→L1→…→Ln-1→Ln,
reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→…

You must do this in-place without altering the nodes’ values.

For example,
Given {1,2,3,4}, reorder it to {1,4,2,3}.


L : L0→L1→…→Ln-1→Ln 分成两个链表
L1:L0→L2→…→Ln/2
L2 : Ln/2+1…→Ln 再将 L2翻转 L2:Ln…→Ln/2+1
然后再合并两个表。

class Solution {
public:
    ListNode* reverselist ( ListNode* head  ) {
        ListNode* p = head, *q = head->next, *r = NULL;
        while ( q != NULL ) {
            r = q->next;
            q->next = p;
            p = q;
            q = r;
        }
        head->next = NULL;
        return ( head = p );
    }

    ListNode* getmid ( ListNode* head, bool sblit = true ) {
        if ( head == NULL || head->next == NULL || head->next->next == NULL ) {
            return head;
        }

        ListNode* p = head, *q = head, *r = NULL;
        while ( q != NULL && q->next != NULL ) {
            r = p;
            p = p->next;
            q = q->next->next;
        }
        if ( sblit == true ) {
            r->next = NULL;
        }
        return p;
    }

    ListNode* connectlist ( ListNode* p, ListNode* q ) {
        if ( p == NULL ) {
            return q;
        }else if ( q == NULL ) {
            return p;

        /* both p and q are all not NULL */
        bool flag = true;   // 使用flag来轮转
        ListNode* r = p, *head = p;

        while ( p != NULL && q != NULL ) {
            if ( flag ) {
                p = p->next;
                head->next = q;
                flag = false;
            } else {
                q = q->next;
                head->next = p;
                flag = true;
            }
            head = head->next;
        }

        //head->next = ( p != NULL ? p : q );

        return r;
    }

    void reorderList ( ListNode *head ) {

        /* 指针为NULL,或者只有一个元素,或者只有两个元素,不做任何处理 */
        if ( head == NULL || head->next == NULL || head->next->next == NULL ) {
            return ;
        }        
        ListNode* mid = getmid ( head );
        mid = reverselist ( mid );
        head = connectlist ( head, mid );
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值