143. Reorder List leetcode list

  1. 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}
void reorderList(ListNode* head) {
        //思路:首先获取链表的后部分链表,然后将后部分链表一一插入到前部分,最后返回
        if(NULL == head || NULL == head->next || NULL == head->next->next)
        {
            return ;
        }

        //获取链表的中间节点的后一个节点
        ListNode* slow = head;
        ListNode* fast = head;
        while(fast)
        {
            fast = fast->next;
            if(fast)
            {
                slow = slow->next;
                fast = fast->next;
            }
        }
        fast = slow->next; //链表的中间节点的后一个节点
        slow->next = NULL; 

        //以下部分是将链表的后半部分进行倒置
        ListNode* p = fast;
        ListNode* q = fast->next;//最初忽略了后半部分的最后一个节点的next要设置为NULL,倒置一开始提交时总是出错!!!
        fast->next = NULL;
        while(q)
        {
            ListNode* temp = q->next;
            q->next = p;
            p = q;
            q = temp;
        }

        //以下部分是将倒置的后半部分依次插入前半部分中去
        q = head;//q设置为前半部分的head,p是后半部分的head
        cout<<"p->val"<<endl;
        while(p && q)
        {
            ListNode* tempp = p->next;
            ListNode* tempq = q->next;
            p->next = q->next;
            q->next = p;
            q = tempq;
            p = tempp;
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值