2013——M笔试南京——程序

迄今只参加了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的题,我看了下网上关于最后一天的解答,羞愧地无地自容啊,自己写的错误程序误导了他人;我昨天写的程序有误(反转),处理有冗余(合并)。如果有人看了我的随笔记录,如有错误,可以在文中指出,也可以发邮件给我……感谢

posted on 2013-09-28 13:20  阿加  阅读(554)  评论(0编辑  收藏  举报

导航