题目:
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:
void reorderList(ListNode *head)
{
if (head == NULL || head->next == NULL)
return;
ListNode* slow = head, *fast = head;
//find the middle point
while (fast->next != NULL && fast->next->next != NULL)
{
slow = slow->next;
fast = fast->next->next;
}
//break and reverse the second half of list
fast = slow;
slow = slow->next;
fast->next = NULL;
slow = reverse(slow);
ListNode* curr = head;
while (curr->next)
{
ListNode* tmp = curr->next;
curr->next = slow;
slow = slow->next;
curr->next->next = tmp;
curr = tmp;
}
curr->next = slow;
}
ListNode* reverse(ListNode* head)
{
if (head == NULL || head->next == NULL)
return head;
ListNode* prev = head;
for(ListNode *curr = prev->next, *Next = curr->next; curr; )
{
curr->next = prev;
prev = curr;
curr = Next;
Next = Next ? Next->next : Next;
}
head->next = NULL;
return prev;
}
};