核心思想
  • 递归
  • 每入栈,标记出来尾结点,且断开其父节点
  • 入栈是往中间走
  • 出栈是从中间开始排序,往两边走
/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 * };
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */

/**
 * 
 * @param head ListNode类 
 * @return  void
 */
// static struct ListNode * oldHead = NULL;
// static struct ListNode * curl = NULL;

// struct ListNode * reverse(struct ListNode * head)
// {
//     // 尾结点条件
//     static int len = 1;
//     len++;
//     if(head->next->next == NULL)
//     {
//         return head;
//     }
    
//     struct ListNode * tail = NULL;
//     tail = reverse(head->next);
//     if(len < (len/2 -1))
//     {
//         return head;
//     }
//     tail->next->next = curl->next;
//     curl->next = tail->next;
//     tail->next = NULL;
//     curl = curl->next->next;
//     // 找到尾结点后,把尾结点插入到头结点后,且头结点curl预先指向下一个结点
    
//     return head;
// }

void reorderList(struct ListNode* head ) {
    // write code here
    if(head == NULL)
    {
        return;
    }
    
    if(head->next == NULL || head->next->next == NULL)
    {
        return;
    }
    
    struct ListNode * curl = head;
    while(curl->next->next != NULL)
    {
        curl = curl->next;
    }
    
    struct ListNode * tail = curl->next;
    curl->next = NULL;
    reorderList(head->next);
    tail->next = head->next;
      
    head->next = tail;
}