题目:重排链表
Description
给定一个单链表 L:L0→L1→…→Ln-1→Ln ,
将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→…
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
Sample
给定链表 1->2->3->4->5, 重新排列为 1->5->2->4->3.
Solution
每次取当前第一个和最后一个节点,重新连接,得到多条两个节点的链(总节点数为奇数时有一条一个节点的链),按要求串起来,即可!
注意尾节点指针域指向空!
AC Code
class Solution {
public:
void reorderList(ListNode* head) {
if(head==NULL||head->next==NULL||head->next->next==NULL) return;
stack<ListNode*> s;
queue<ListNode*> q;
int num=0;
ListNode * temp = head;
while(temp){
num++;
s.push(temp);
q.push(temp);
temp=temp->next;
}
stack<ListNode*> t;
ListNode * a ,*b,*c,*d;
for(int i=0;i<num/2;i++){
a=q.front();
q.pop();
b=s.top();
s.pop();
a->next=b;
if(!t.empty()){
c=t.top();
c->next=a;
}
t.push(b);
}
if(num%2){
c=t.top();
d=s.top();
c->next = d;
d->next =NULL;
}
else b->next =NULL;
return;
}
};