迄今只参加了M南京笔试,可惜自己不是计算机出身,还有好多东西得学啊……
M的最后一题是编程:
输入:单链表L0、L1、L2……Ln-1、Ln,将链表变为:L0、Ln、L1、Ln-1、L2……
算法:
1、将链表分成前后两个部分: 前一个链表长度 >= 后一链表长度; 简单 2、反转后一个链表; 简单 3、合并两个链表; 简单 4、调用以上接口; gameover
算法实现:
typedef struct Node Node_t;
Node_t *list_half(Node_t *head) { Node_t *rv = NULL; Node_t *start = head, *end = head; while(end && end->next && end->next->next) { end = end->next->next; start = start->next; } if(start != NULL) { rv = start->next; start->next = NULL; } return rv; } Node_t *list_reverse(Node_t *head) { Node_t *rv = head; Node_t *prev = NULL, *current= head, *next = NULL;
while(current) { next = current->next;
current->next = prev; prev = current; current = next; } rv = prev;
return rv; } /* head_first.len >= head_second.len * or: please check next_second == NULL */ Node_t *list_merge(Node_t *head_first, Node_t *head_second) { Node_t *rv = head_first; Node_t *next_first = NULL, *next_second = NULL; #define LEN_DEFENSE #undef LEN_DEFENSE #ifdef LEN_DEFENSE Node_t **tail_chek = NULL;
if(head_first == NULL)
return head_second; #endif while(head_first && head_second) { next_first = head_first->next; next_second = head_second->next; head_first->next = head_second; head_second->next = next_first; #ifdef LEN_DEFENSE tail_chek = &head_second->next; #endif head_first = next_first; head_second = next_second; } #ifdef LEN_DEFENSE
if(tail_check)
{ *tail_check = head_second;
} #endif return rv; } Node_t *list_result(Node_t *head) { Node_t *head_halflist = list_half(head); head_halflist = list_reverse(head_halflist); head = list_merge(head, head_halflist); return head; }
可是最后我把list_result中的最后的“return head" 写成了 ”return 0“,原因在于:
我开始想让他们提供接口,我写出的程序进行调用,因此自己就写了main函数;后来,我想不一定要生成可执行程序,所以自己提供个接口给他们调用获得返回值,结果我只改了main的函数名和参数,最后的返回值忘改了。
行百里者,半九十……
还是好好看内存管理吧,Z先生指定的书还没看完……
2013.9.29
附:晚上同学说了下M的题,我看了下网上关于最后一天的解答,羞愧地无地自容啊,自己写的错误程序误导了他人;我昨天写的程序有误(反转),处理有冗余(合并)。如果有人看了我的随笔记录,如有错误,可以在文中指出,也可以发邮件给我……感谢