笔试题

Given a singly linked list L: (L0 , L1 , L2...Ln-1 , Ln). Write a program to reorder it so that it becomes(L0 , Ln , L1 , Ln-1 , L2 , Ln-2...).
[cpp]  view plain  copy
  1. struct Node  
  2. {  
  3.     int val_;  
  4.     Node* next;  
  5. };  
Notes:
1、Space Complexity should be O(1) 
2、Only the ".next" field of a node is modifiable.
代码:

[cpp]  view plain  copy
  1. //转载请标明出处,原文地址:http://blog.csdn.net/hackbuteer1/article/details/12190807  
  2. struct Node  
  3. {    
  4.     int val_;    
  5.     Node* next;    
  6. };  
  7. Node* reverse_list(Node* phead)   //链表反转  
  8. {  
  9.     Node *temp ,*curr , *pre , *reverse_head;  
  10.     pre = NULL;  
  11.     curr = phead;  
  12.     while(curr->next)  
  13.     {  
  14.         temp = curr->next;  
  15.         curr->next = pre;  
  16.         pre = curr;  
  17.         curr = temp;  
  18.     }  
  19.     curr->next = pre;  
  20.     reverse_head = curr;  
  21.     return reverse_head;  
  22. }  
  23.   
  24. Node* Merge(Node* slow , Node* fast)  
  25. {  
  26.     if(fast == NULL)  
  27.         return slow;  
  28.     if(slow == NULL)  
  29.         return fast;  
  30.     Node *head , *result;  
  31.     result = NULL;  
  32.     int i = 0;  
  33.     while(slow && fast)  
  34.     {  
  35.         if(0 == i)  
  36.         {  
  37.             if(NULL == result)  
  38.             {  
  39.                 head = result = slow;  
  40.                 slow = slow->next;  
  41.             }  
  42.             else  
  43.             {  
  44.                 result->next = slow;  
  45.                 slow = slow->next;  
  46.                 result = result->next;  
  47.             }  
  48.         }  
  49.         else  
  50.         {  
  51.             if(NULL == result)  
  52.             {  
  53.                 head = result = fast;  
  54.                 fast = fast->next;  
  55.             }  
  56.             else  
  57.             {  
  58.                 result->next = fast;  
  59.                 fast = fast->next;  
  60.                 result = result->next;  
  61.             }  
  62.         }  
  63.         i ^= 1;  
  64.     }//while  
  65.     if(slow)  
  66.     {  
  67.         result->next = slow;  
  68.     }  
  69.     if(fast)  
  70.     {  
  71.         result->next = fast;  
  72.     }  
  73.     return head;  
  74. }  
  75.   
  76. Node* reorder_list(Node* phead)  
  77. {  
  78.     Node *r_head , *slow , *fast;  
  79.     r_head = slow = fast = phead;  
  80.     while(fast->next != NULL && fast->next->next != NULL)  
  81.     {  
  82.         slow = slow->next;  
  83.         fast = fast->next->next;  
  84.     }  
  85.     if(slow->next == NULL)  
  86.         return r_head;  
  87.     fast = slow->next;  
  88.     slow->next = NULL;  
  89.     slow = phead;  
  90.     fast = reverse_list(fast);      //链表的后半部分反转  
  91.     r_head = Merge(slow , fast);    //链表归并  
  92.     return r_head;  
  93. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值