zoukankan      html  css  js  c++  java
  • [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 };
  • 相关阅读:
    WCF初探-21:WCF终结点(endpoint)
    WCF初探-20:WCF错误协定
    WCF初探-19:WCF消息协定
    WCF初探-18:WCF数据协定之KnownType
    WCF初探-17:WCF数据协定之等效性
    WCF初探-16:WCF数据协定之基础知识
    WCF初探-15:WCF操作协定
    WCF初探-14:WCF服务协定
    WCF初探-13:WCF客户端为双工服务创建回调对象
    WCF初探-12:WCF客户端异常处理
  • 原文地址:https://www.cnblogs.com/Marrybe/p/3777959.html
Copyright © 2011-2022 走看看