一道微软笔试题
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; }
相关文章推荐
- 送上今年微软的一道笔试题
- 一道微软的Mini-Test笔试题(一)
- 一道微软的Mini-Test笔试题(二)
- 一道微软笔试题: 4个袋子,15个球,每个袋子至少放一个球,而且袋子中的球数量不能重复,有多少种方式
- 一道微软的Mini-Test笔试题 解决方法。
- 微软的一道C语言笔试题(转)
- 一道网上找的微软笔试题
- 赴微软测试工程师必考一道笔试题目
- 微软的一道笔试编程试题
- 一道微软MiniTest笔试题
- 一道微软笔试题,算法才是王道
- 微软最新的一道笔试题,我觉的出的不好,要改的地方太多了
- 微软一道笔试题目
- 一道微软笔试题
- 送上今年微软的一道笔试题
- 数位DP--由一道微软笔试题引起
- C语言测试题目解答:微软一道笔试题,2005年华为招聘
- 一道微软笔试题
- 一道关于C++ 继承/虚函数 笔试题