Reorder List

来源:互联网 发布:touch炫舞捏脸数据女 编辑:程序博客网 时间:2024/06/05 18:09

Given a singly linked list LL0L1→…→Ln-1Ln,
reorder it to: L0LnL1Ln-1L2Ln-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}.

算法思路是进行三次遍历,第一次遍历确定中间节点slow,第二次遍历后半段将后半段链表逆转,第三次从首向前,从尾向后同时遍历。

/** * 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) {        if(head==NULL || head->next==NULL || head->next->next==NULL) return;                ListNode *slow=head,*fast=head;        while(fast->next && fast->next->next){            slow = slow->next;            fast = fast->next->next;        }               ListNode *p = slow->next, *pp = slow, *sp = p->next;        slow->next = NULL;         //逆转后半段链表        while(p!=NULL){            p->next = pp;            pp = p;            p = sp;            if(sp) sp = sp->next;        }                p = head;        while(pp!=slow){            sp = pp->next;            pp->next = p->next;            p->next = pp;            p = p->next->next;            pp = sp;        }            }};


0 0
原创粉丝点击