链接:https://oj.leetcode.com/problems/reorder-list/
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}
.
将链表分成两部分,然后将后面一个链表反转,最后重组链表。
void reorderList(ListNode *head) {
if(head == NULL ||
head->next == NULL ||
head->next->next == NULL)
return;
ListNode dumy(-1);
dumy.next = head;
ListNode *first = &dumy;
ListNode *second = &dumy;
while(first->next != NULL && first->next->next != NULL)
{
second = second->next;
first = first->next->next;
}
if(first->next)
{
first = first->next;
second = second->next;
}
ListNode dumy2(-1);
dumy2.next = second->next;
second->next = NULL;
second = dumy2.next;
// reverse the second List
ListNode *pre = second;
ListNode *cur = second->next;
while(cur)
{
pre->next = cur->next;
cur->next = dumy2.next;
dumy2.next = cur;
cur = pre->next;
}
//reorder
ListNode *p1 = dumy.next;
ListNode *p2 = dumy2.next;
while(p2)
{
dumy2.next = p2->next;
p2->next = p1->next;
p1->next = p2;
p1 = p2->next;
p2 = dumy2.next;
}
}