您的位置:首页 > 其它

Reorder List --LeetCode

2015-07-31 23:15 399 查看
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}
.

核心在与双指针如何控制slow指针落在合适的位置,

如果需要落在中间偏左则需要从head之前的节点开始遍历;

如果需要落在中间偏右,则直接从head开始遍历。

/**
* 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;
ListNode* fast=head;
while(fast && fast->next){
slow=slow->next;
fast=fast->next->next;
}

ListNode* h=slow->next;
slow->next=NULL;
stack<ListNode*> s;
while(h){
s.push(h);
h=h->next;
}

ListNode* p=head;
while(!s.empty() && p){
ListNode* tmp=s.top();
s.pop();
tmp->next=p->next;
p->next=tmp;
p=p->next->next;
}

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