Reorder List--简单粗暴的水题

题目大意

好吧,这题之前看错题目了,以为是按照奇偶依次提取然后将偶序列倒序后插入奇序列,那写得我叫一个纠结,后来仔细读了一遍题目才发现不是酱紫。。题目大意是将一个链表的后半段倒序后依次插入前半段的空格中,简单粗暴。


思路

显然解法也是简单粗暴,顺序就是:截取后半段->倒序->插入前半段,详见代码


总结

看题得仔细,另外插入时注意对空结点的处理


代码

  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.         ListNode *reverse(ListNode *cur, ListNode *fa)//翻转链表   
  12.         {  
  13.             if (cur == NULL)return fa;  
  14.                 ListNode *temp = reverse(cur->next, cur);  
  15.             cur->next = fa;  
  16.             return temp;  
  17.         }  
  18.         void reorderList(ListNode *head)  
  19.         {  
  20.             if (head == NULL)return ;  
  21.             ListNode *headE, *headO, *f_p, *s_p;  
  22.             f_p = s_p = headE = headO = head;//快慢指针   
  23.             int count = 0;  
  24.             while (f_p->next != NULL){  
  25.                 if (count % 2)s_p = s_p -> next;  
  26.                 f_p = f_p -> next;  
  27.                 count ++;  
  28.             }  
  29.             headO = s_p->next;//后半段序列的头   
  30.             s_p->next = NULL;//断链   
  31.             headO = reverse(headO, NULL);//翻转   
  32.             ListNode *odd = headO;  
  33.             ListNode *even = headE;  
  34.             while (odd != NULL || even != NULL){//插入   
  35.                 ListNode *tmp = even;  
  36.                 if (even != NULL) even = even->next;  
  37.                 if (odd != NULL)  tmp->next = odd;     
  38.                 tmp = odd;  
  39.                 if (odd != NULL)  odd = odd-> next;  
  40.                 if (even != NULL) tmp->next = even;           
  41.             }  
  42.               
  43.         }          
  44. };  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值