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;
}
}
};