[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 };