[LeetCode OJ] Reorder List—Given a singly linked list L: L0→L1→…→Ln-1→Ln, reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→…

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

 1 /**
 2  * Definition for singly-linked list.
 3  * struct ListNode {
 4  *     int val;
 5  *     ListNode *next;
 6  *     ListNode(int x) : val(x), next(NULL) {}
 7  * };
 8  */
 9 class Solution {
10 public:
11     void reorderList(ListNode *head) {
12         //求链表的总长度len
13         if(head==NULL)
14             return;
15         int len=0;
16         ListNode *p = head; //tail用于指向整个链表的尾节点
17         while(p!=NULL)
18         {
19             p = p->next;
20             len++;
21         }
22         //将链表拆成两半,并将后半部分的链表顺序倒置,如原来链表为L1->L2->L3->L4->L5->L6->L7,现在得到两个链表L1->L2->L3->L4和L7->L6->L5
23         int i=0;
24         ListNode * h1 = head;
25         ListNode * h2 = head ,*pre;
26         while(i<(len+1)/2)
27         {
28             pre = h2;
29             h2 = h2->next;
30             i++;
31         }
32         pre->next = NULL; //h1指向拆分后得到的第一个链表的第一个节点,并将第一个链表的最后一个节点的指针域置为NULL; h2指向拆分后得到的第二个链表的第一个节点,到这一步尚未对第二个链表倒置
33          
34         //对第二个链表进行倒置
35         ListNode * temp;
36         p = h2;
37         if(p!=NULL)
38         {
39 
40             h2 = h2->next;
41             p->next = NULL;
42             while(h2!=NULL)
43             {
44                 temp = h2;
45                 h2 = h2->next;
46                 temp->next = p;
47                 p = temp;
48             }
49         }
50         h2 = p;
51 
52         //由两个链表L1->L2->L3->L4和L7->L6->L5按如下方式得到所求的第三个链表,将第一个链表的第一个节点连接到第三个链表的末端,再将第二个链表的第一个节点连接到第三个链表的末端,以此类推,直到两个链表都为空
53         //得到的第三个链表便是L1->L7->L2->L6->L3->L5->L4
54         ListNode * tail = h1;
55         h1 = h1->next;
56         i = 0;
57         while(h1!=NULL || h2!=NULL)
58         {
59             tail->next = (++i%2)? h2 : h1;
60             tail = tail->next;
61             (i%2) ? (h2 = h2->next) : (h1 = h1->next);
62         }
63         return;  
64     }
65 };

 

posted @ 2014-06-09 15:25  Marrybe  阅读(730)  评论(0编辑  收藏  举报