/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
void reorderList(ListNode *head) {
if(head == nullptr) return ;
// 链表折叠?
// 1. 找到中间节点!
// 2. 将链表断开,并后半段放入栈中!
// 3. 依次弹出连接即可!
ListNode* fast = head;
ListNode* slow = head;
ListNode* pre = nullptr;
while(fast != nullptr){
fast = fast->next;
if(fast == nullptr) break;
pre = slow;
slow = slow->next;
fast = fast->next;
}
if(slow == head) return; // 链表中 <=2 个元素!
if(pre) pre->next = nullptr;
ListNode* midHead = slow;
stack<ListNode*> stk;
while(midHead){
stk.push(midHead);
midHead = midHead->next;
}
ListNode* cur = head;
ListNode* tmp;
while(!stk.empty()){
tmp = stk.top();
stk.pop();
tmp->next = cur->next;
cur->next = tmp;
cur = cur->next;
if(cur->next) cur = cur->next;
}
}
};