问题描述:
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.
示例,
Given {1,2,3,4}
, reorder it to {1,4,2,3}
.
问题分析:
对于此类问题,统计结点数目,并找到中间结点mid,对mid后的结点依次插入即可。
例如
l0,l1,l2,l6,l3,l4,l5这个链表来说,l6是mid,之后就是将l5插入l0和l1之间,l4插入l1和l2之间,l3插入l2和l6之间。
过程详见代码:
/**
* 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) {
vector<ListNode*> res;
ListNode * temp = head;
int num = 0;
while (temp)
{
num++;
res.emplace_back(temp);
temp = temp->next;
}
temp = head;
for (int i = 1; i <= num / 2; i++)
{
if (temp->next == res[num - i]) return;
res[num - i]->next = temp->next;
temp->next = res[num - i];
temp = res[num - i]->next;
res[num - i - 1]->next = NULL;
}
}
};