您的位置:首页 > 其它

LeetCode: Reorder List

2014-08-12 14:25 253 查看
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) {
int count =0;
ListNode* half = head;
ListNode* itr = head;
while(itr)
{
count++;
itr = itr->next;
}
itr = head;
if(count == 0 || count == 1 || count == 2)
return;
for(int i = 0; i < count/2; i++)
{
itr = half;
half = half->next;
}
itr->next = NULL;

ListNode* pre = NULL;
ListNode* cur = half;
while(cur)
{
ListNode* next = cur->next;
cur->next = pre;
pre = cur;
cur = next;
}
half = pre;
itr = head;
while(itr && half)
{
ListNode* h_next = itr->next;
ListNode* e_next = half->next;
if(h_next)
half->next = itr->next;
itr->next = half;
itr = h_next;
half = e_next;
}

}
};

Round 2:

class Solution {
public:
void reorderList(ListNode *head) {
int size = 0;
ListNode *iter = head, *rhead = head, *pre = NULL, *next = NULL;
while(iter)
{
iter = iter->next;
size++;
}
int mid = 0;
iter = head;
while(mid < size/2)
{
if(mid == size/2-1)
{
rhead = iter->next;
iter->next = NULL;
}
iter = iter->next;
mid++;
}
while(rhead != NULL)
{
next = rhead->next;
rhead->next = pre;
pre = rhead;
rhead = next;
}
iter = head;
rhead = pre;
while(iter != NULL)
{
next = iter->next;
if(next == NULL)
next = rhead->next;
iter->next = rhead;
rhead = rhead->next;
iter->next->next = next;
iter = next;
}

}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: