您的位置:首页 > 编程语言

微软2014校招笔试编程题

2013-09-30 16:39 288 查看
Given asingly linked list L:(L0,L1,L2,...,Ln-1,Ln).Write a program to reorder it so that it becomes(L0,Ln,L1,Ln-1,L2,Ln-2,...)
struct Node
{
int val_;
Node* next;
};

Notes:

1.Space Complexity should be O(1)
2.Only the ".next" field of a node is modifiable.

新方法:[传送门](2013.11.16 update

#include"stdafx.h"
#include<iostream>
using namespace std;

struct Node
{
int val_;
Node* next;
};

Node *CreateListNode(int key)
{
Node *ListNode=new Node;
ListNode->val_=key;
ListNode->next=NULL;
return ListNode;
}

void ConnectListNodes(Node *ListNode1,Node *ListNode2)
{
ListNode1->next=ListNode2;
}

void PrintList(Node *ListHead)
{
Node* p=ListHead;
while(p!=NULL)
{
cout<<p->val_<<" ";
p=p->next;
}
cout<<endl;
}

void ReorderList(Node *ListHead)
{
Node *i,*j,*p,*q;

i=ListHead;
while(i&&i->next!=NULL)
{
j=i->next;
p=i;
q=i->next;
while(q->next!=NULL)
{
p=p->next;
q=q->next;
}
if(q!=j)
{
i->next=q;
q->next=j;
p->next=NULL;
}
else
{
i->next=q;
}
i=j;
j=j->next;
}
}

void DestroyList(Node *ListHead)
{
ListHead=NULL;
}

void Test(Node* ListHead)
{
PrintList(ListHead);
ReorderList(ListHead);
PrintList(ListHead);
}
// 0->1->2->3->4->5
void Test1()
{
cout<<"Test1 begins."<<endl;
Node *ListNode0=CreateListNode(0);
Node *ListNode1=CreateListNode(1);
Node *ListNode2=CreateListNode(2);
Node *ListNode3=CreateListNode(3);
Node *ListNode4=CreateListNode(4);
Node *ListNode5=CreateListNode(5);
ConnectListNodes(ListNode0,ListNode1);
ConnectListNodes(ListNode1,ListNode2);
ConnectListNodes(ListNode2,ListNode3);
ConnectListNodes(ListNode3,ListNode4);
ConnectListNodes(ListNode4,ListNode5);

Test(ListNode0);
DestroyList(ListNode0);
}
// 0->1->2->3->4->5->6
void Test2()
{
cout<<"Test2 begins."<<endl;
Node *ListNode0=CreateListNode(0);
Node *ListNode1=CreateListNode(1);
Node *ListNode2=CreateListNode(2);
Node *ListNode3=CreateListNode(3);
Node *ListNode4=CreateListNode(4);
Node *ListNode5=CreateListNode(5);
Node *ListNode6=CreateListNode(6);
ConnectListNodes(ListNode0,ListNode1);
ConnectListNodes(ListNode1,ListNode2);
ConnectListNodes(ListNode2,ListNode3);
ConnectListNodes(ListNode3,ListNode4);
ConnectListNodes(ListNode4,ListNode5);
ConnectListNodes(ListNode5,ListNode6);

Test(ListNode0);
DestroyList(ListNode0);
}

// 只有一个结点
void Test3()
{
cout<<"Test3 begins."<<endl;
Node* ListNode0=CreateListNode(0);
Test(ListNode0);
DestroyList(ListNode0);
}

// 空链表
void Test4()
{
cout<<"Test4 begins."<<endl;
Test(NULL);
}

int main()
{
Test1();
Test2();
Test3();
Test4();
return 0;
}




总结:1.离开了VS,自己手写并且能够写对还是很困难。
2.时间复杂度O(n2),应该还可以优化。

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