您的位置:首页 > 其它

leetcode Reorder List

2014-04-12 20:16 330 查看
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}
.

#include <iostream>
using namespace std;
/**
* Definition for singly-linked list.*/
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};

void print(ListNode * head)
{
while(head != NULL)
{
cout << head->val << " ";
head = head->next;
}
cout << endl;
}

class Solution {
public:
//先将中心节点以后的节点倒序然后进行插入
//如 L1 L2 L3 L4 L5
// L1 L2 L3 L5 L4
// L1 L5 L2 L4 L3
void reorderList(ListNode *head) {
if(head == NULL || head->next == NULL || head->next->next == NULL)
return;
ListNode *midIterator = head;
ListNode *tailIterator = head->next;
while(tailIterator != NULL && tailIterator->next != NULL)
{
midIterator = midIterator->next;
tailIterator = tailIterator->next->next;
}

ListNode * rightiterator = midIterator->next->next;
midIterator->next->next = NULL;
ListNode * tempiterator = NULL;

while(rightiterator != NULL)
{
tempiterator = rightiterator;
rightiterator = rightiterator->next;
tempiterator->next = midIterator->next;
midIterator->next = tempiterator;
}

ListNode * leftiterator = head;
rightiterator = midIterator->next;
while (1)
{
tempiterator = rightiterator;
rightiterator = rightiterator->next;
tempiterator->next = leftiterator->next;
leftiterator->next = tempiterator;
leftiterator = leftiterator->next->next;
if(leftiterator == midIterator)
break;
}
midIterator->next = rightiterator;
if(rightiterator != NULL)
rightiterator->next = NULL;
}
};

int main()
{
ListNode a(1);
ListNode b(2);
ListNode c(3);
ListNode d(4);
ListNode e(5);
a.next = &b;
b.next = &c;
c.next = &d;
d.next = &e;
e.next = NULL;
ListNode *head = &a;
Solution s;
s.reorderList(head);
print(head);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: