您的位置:首页 > 其它

一道微软笔试题

2014-11-24 09:34 302 查看


算法思路:先将链表后半部分逆序,然后用两对指针分别操作节点的指向。

#include<stdio.h>
#include<stdlib.h>

typedef struct Node
{
int num;
struct Node* next;
};

void BuildLink(Node*& head, int num)
{
Node* ptrCurrent=NULL;
for(int i=0; i<num; i++)
{
Node* aNode=(Node*)malloc(sizeof(Node));
aNode->num=i+1;
aNode->next=NULL;
if(i==0)
{
head=ptrCurrent=aNode;
}
else
{
ptrCurrent->next=aNode;
ptrCurrent=aNode;
}
}
}

void ReleaseLink(Node*& head)
{
Node* ptr=NULL;

while(head!=NULL)
{
ptr=head;
head=head->next;
free(ptr);
}
}

int CalLinkLength(Node* head)
{
Node* ptr=head;
int len=0;
while(ptr!=NULL)
{
ptr=ptr->next;
len++;
}
return len;
}

Node* ReverseLink(Node* head)
{
Node* pPrev=NULL;;
Node* pCurrent=head;
Node* pNext=NULL;

while (pCurrent!=NULL)
{
pNext=pCurrent->next;
pCurrent->next=pPrev;
pPrev=pCurrent;
pCurrent=pNext;
}
return pPrev;
}

void ReverseRightHalf(Node*& head, int len)
{
int step=len/2;

Node* ptr=head;
for(int i=0; i<step; i++)
ptr=ptr->next;

Node* p=ptr;
p->next=ReverseLink(p->next);
Node* ptr2=p->next;
p->next=NULL;

Node* ptr1=head;
Node* next1=NULL, *next2=NULL;
while(ptr1!=NULL && ptr2!=NULL)
{
next1=ptr1->next;
next2=ptr2->next;

ptr1->next=ptr2;
ptr2->next=next1;

ptr1=next1;
ptr2=next2;
}
}

int main(int argc, char** argv)
{
Node* head=NULL;
BuildLink(head, 10);
int len=CalLinkLength(head);
ReverseRightHalf(head, len);
ReleaseLink(head);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: