#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <unordered_map>
using namespace std;
struct Node{
int val;
Node* next;
Node* child;
Node(int value):val(value),next(NULL),child(NULL) {}
};
Node* createTree(){
Node* head=new Node(1);
head->next=new Node(2);
head->next->next=new Node(3);
head->next->next->next=new Node(7);
head->next->next->next->next=new Node(8);
head->next->next->child=new Node(4);
head->next->next->child->next=new Node(5);
head->next->next->child->next->next=new Node(6);
head->next->next->child->next->child=new Node(50);
head->next->next->child->next->child->next=new Node(51);
return head;
}
void printList(Node* head){
Node* current=head;
while(current){
cout<<current->val<<" ";
if(current->child){
cout<< "--";
printList(current->child);
cout<< "--";
}
current=current->next;
}
}
void restoreList(Node* head,unordered_map<Node*,Node*>& oldPositions ){
if(oldPositions.size()==0) return;
Node* current=head;
while(current){
if(oldPositions.find(current)!=oldPositions.end()){
Node* oldNext=oldPositions[current]->next;
oldPositions[current]->next=NULL;
restoreList(current->next, oldPositions);
current->child=current->next;
current->next=oldNext;
oldPositions.erase(current);
}
current=current->next;
}
}
//to be implemented
Node* flatList(Node* head, Node*& tail, unordered_map<Node*,Node*>& oldPositions){
if(NULL==head){
tail=NULL;
return NULL;
}
Node* current=head;
while(current){
Node* next=current->next;
if(current->child){
Node* flatTail=NULL;
Node* flatHead=flatList(current->child, flatTail,oldPositions);
oldPositions[current]=flatTail;
current->child=NULL;
current->next=flatHead;
flatTail->next=next;
}
if(current->next==NULL)
tail=current;
current=current->next;
}
return head;
}
int main(int argc, char const *argv[])
{
Node* head=createTree();
printList(head);
Node* temp=NULL;
unordered_map<Node*,Node*> oldPositions;
Node* flatHead=flatList(head, temp, oldPositions);
cout<<endl;
printList(flatHead);
restoreList(head, oldPositions);
cout<<endl;
printList(head);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0ZGlvPgojaW5jbHVkZSA8Y3N0ZGxpYj4KI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IE5vZGV7CglpbnQgdmFsOwoJTm9kZSogbmV4dDsKCU5vZGUqIGNoaWxkOwoJTm9kZShpbnQgdmFsdWUpOnZhbCh2YWx1ZSksbmV4dChOVUxMKSxjaGlsZChOVUxMKSB7fQp9OwoKCk5vZGUqIGNyZWF0ZVRyZWUoKXsKCU5vZGUqIGhlYWQ9bmV3IE5vZGUoMSk7CgloZWFkLT5uZXh0PW5ldyBOb2RlKDIpOwoJaGVhZC0+bmV4dC0+bmV4dD1uZXcgTm9kZSgzKTsKCWhlYWQtPm5leHQtPm5leHQtPm5leHQ9bmV3IE5vZGUoNyk7CgloZWFkLT5uZXh0LT5uZXh0LT5uZXh0LT5uZXh0PW5ldyBOb2RlKDgpOwoKCWhlYWQtPm5leHQtPm5leHQtPmNoaWxkPW5ldyBOb2RlKDQpOwoJaGVhZC0+bmV4dC0+bmV4dC0+Y2hpbGQtPm5leHQ9bmV3IE5vZGUoNSk7CgloZWFkLT5uZXh0LT5uZXh0LT5jaGlsZC0+bmV4dC0+bmV4dD1uZXcgTm9kZSg2KTsKCgloZWFkLT5uZXh0LT5uZXh0LT5jaGlsZC0+bmV4dC0+Y2hpbGQ9bmV3IE5vZGUoNTApOwoJaGVhZC0+bmV4dC0+bmV4dC0+Y2hpbGQtPm5leHQtPmNoaWxkLT5uZXh0PW5ldyBOb2RlKDUxKTsKCglyZXR1cm4gaGVhZDsKfQoKCnZvaWQgcHJpbnRMaXN0KE5vZGUqIGhlYWQpewoJCglOb2RlKiBjdXJyZW50PWhlYWQ7Cgl3aGlsZShjdXJyZW50KXsKCQljb3V0PDxjdXJyZW50LT52YWw8PCIgIjsKCQlpZihjdXJyZW50LT5jaGlsZCl7CgkJCWNvdXQ8PCAiLS0iOwoJCQlwcmludExpc3QoY3VycmVudC0+Y2hpbGQpOwoJCQljb3V0PDwgIi0tIjsKCQl9CgkJY3VycmVudD1jdXJyZW50LT5uZXh0OwoJfQp9Cgp2b2lkIHJlc3RvcmVMaXN0KE5vZGUqIGhlYWQsdW5vcmRlcmVkX21hcDxOb2RlKixOb2RlKj4mIG9sZFBvc2l0aW9ucyApewoJaWYob2xkUG9zaXRpb25zLnNpemUoKT09MCkgcmV0dXJuOwoKCU5vZGUqIGN1cnJlbnQ9aGVhZDsKCXdoaWxlKGN1cnJlbnQpewoJCWlmKG9sZFBvc2l0aW9ucy5maW5kKGN1cnJlbnQpIT1vbGRQb3NpdGlvbnMuZW5kKCkpewoJCQlOb2RlKiBvbGROZXh0PW9sZFBvc2l0aW9uc1tjdXJyZW50XS0+bmV4dDsKCQkJb2xkUG9zaXRpb25zW2N1cnJlbnRdLT5uZXh0PU5VTEw7CgkJCXJlc3RvcmVMaXN0KGN1cnJlbnQtPm5leHQsIG9sZFBvc2l0aW9ucyk7CgkJCWN1cnJlbnQtPmNoaWxkPWN1cnJlbnQtPm5leHQ7CgkJCWN1cnJlbnQtPm5leHQ9b2xkTmV4dDsKCQkJCgkJCQoJCQlvbGRQb3NpdGlvbnMuZXJhc2UoY3VycmVudCk7CgkJfQoJCWN1cnJlbnQ9Y3VycmVudC0+bmV4dDsKCX0KCn0KCi8vdG8gYmUgaW1wbGVtZW50ZWQKTm9kZSogZmxhdExpc3QoTm9kZSogaGVhZCwgTm9kZSomIHRhaWwsIHVub3JkZXJlZF9tYXA8Tm9kZSosTm9kZSo+JiBvbGRQb3NpdGlvbnMpewoJaWYoTlVMTD09aGVhZCl7CgkJdGFpbD1OVUxMOwoJCXJldHVybiBOVUxMOwoJfQoJCglOb2RlKiBjdXJyZW50PWhlYWQ7Cgl3aGlsZShjdXJyZW50KXsKCgkJTm9kZSogbmV4dD1jdXJyZW50LT5uZXh0OwoKCQlpZihjdXJyZW50LT5jaGlsZCl7CgkJCQoJCQlOb2RlKiBmbGF0VGFpbD1OVUxMOwoJCQlOb2RlKiBmbGF0SGVhZD1mbGF0TGlzdChjdXJyZW50LT5jaGlsZCwgZmxhdFRhaWwsb2xkUG9zaXRpb25zKTsKCQkJb2xkUG9zaXRpb25zW2N1cnJlbnRdPWZsYXRUYWlsOwoJCQljdXJyZW50LT5jaGlsZD1OVUxMOwoJCQljdXJyZW50LT5uZXh0PWZsYXRIZWFkOwoJCQlmbGF0VGFpbC0+bmV4dD1uZXh0OwoJCX0KCgkJaWYoY3VycmVudC0+bmV4dD09TlVMTCkKCQkJdGFpbD1jdXJyZW50OwoJCWN1cnJlbnQ9Y3VycmVudC0+bmV4dDsKCX0KCglyZXR1cm4gaGVhZDsgCn0KCgoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgY29uc3QgKmFyZ3ZbXSkKewoJTm9kZSogaGVhZD1jcmVhdGVUcmVlKCk7CglwcmludExpc3QoaGVhZCk7CglOb2RlKiB0ZW1wPU5VTEw7Cgl1bm9yZGVyZWRfbWFwPE5vZGUqLE5vZGUqPiBvbGRQb3NpdGlvbnM7CglOb2RlKiBmbGF0SGVhZD1mbGF0TGlzdChoZWFkLCB0ZW1wLCBvbGRQb3NpdGlvbnMpOwoJY291dDw8ZW5kbDsKCXByaW50TGlzdChmbGF0SGVhZCk7CglyZXN0b3JlTGlzdChoZWFkLCBvbGRQb3NpdGlvbnMpOwoJY291dDw8ZW5kbDsKCXByaW50TGlzdChoZWFkKTsKCXJldHVybiAwOwp9Cg==