Given a singly linked list L: L0→L1→…→Ln-1→Ln,
reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→…
You must do this in-place without altering the nodes' values.
For example,
Given {1,2,3,4}
, reorder it to {1,4,2,3}
.
注意细节, 先求中间结点, 再反转后半, 再结合一起
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode *middleNode(ListNode *root) { if(!root||!root->next) return root; ListNode *p,*q; p = root; q = root; while(p->next&&p->next->next) { p = p->next->next; q = q->next; } return q; } ListNode *reverseList(ListNode *root) { if(!root||!root->next) return root; ListNode *p,*q,*tem; p = root; q = NULL; while(p) { if(!q) { p = p->next; q = root; q->next = NULL; continue; } tem = p; p = p->next; tem->next = q; q = tem; } return q; } void reorderList(ListNode *head) { // IMPORTANT: Please reset any member data you declared, as // the same Solution instance will be reused for each test case. if(!head||!head->next) return; ListNode *middle_node = middleNode(head); ListNode *newHead = reverseList(middle_node->next); middle_node->next = NULL; ListNode *p,*q,*r,*s; p = head; q = newHead; while(p&&q) { r = p->next; s = q->next; p->next = q; q->next = r; p = r; q = s; } } };