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}
.
class Solution { public: void reorderList(ListNode *head) { if(head==NULL||head->next==NULL) return ; /*[快速求出链表的中间结点]通过两个结点,一个走1个步长,一个走2个步长,最后算出链表的中间结点middleNode*/ ListNode *midNode=head; ListNode *stepNode=head; while(stepNode!=NULL&&stepNode->next!=NULL&&stepNode->next->next!=NULL) { midNode=midNode->next; stepNode=stepNode->next->next; } /*分成两个链表,将链表中间结点之后的链表(链表的后半部分)逆序*/ ListNode *head1=head; ListNode *head2=midNode->next; midNode->next=NULL; ListNode *p=head2->next;//开始求逆序 head2->next=NULL; while(head2&&p) { ListNode *tmp=p->next; p->next=head2; head2=p; p=tmp; } /*完成链表前半部分和逆序后的后半部分的结合!*/ while(head1!=NULL&&head2!=NULL) { ListNode *tmp1=head1->next; ListNode *tmp2=head2->next; head1->next=head2; head2->next=tmp1; head1=tmp1; head2=tmp2; } } };
leetcode:Reorder List,布布扣,bubuko.com
原文地址:http://blog.csdn.net/u010367506/article/details/26179925