反转一个单链表,迭代和递归实现
搜狐2012.9.15校园招聘会笔试题
编程题:
写代码,反转一个单链表,分别以迭代和递归的形式来实现
LinkNode *reverse_link(LinkNode *head)
LinkNode *reverse_link_recursive(LinkNode *head)
真不难简单,可有些细节的东西就是不会处理。。。。⊙﹏⊙b
迭代:
1 LinkNode *reverse_link_my(LinkNode *head) 2 { 3 LinkNode *p, *nh, *q; 4 5 if (!head) 6 { 7 return NULL; 8 } 9 p = head; 10 nh = p->next; 11 if (!nh) 12 { 13 return p; 14 } 15 q = nh->next; 16 p->next = NULL; 17 18 while(q) 19 { 20 nh->next = p; 21 p = nh; 22 nh = q; 23 q = q->next; 24 } 25 nh->next = p; 26 27 return nh; 28 29 }
虽然没有问题的,可是对一些临界条件处理就不如别如此优雅:
// 返回新链表头节点 LinkNode *reverse_link(LinkNode *head) { if(head == NULL) return NULL; LinkNode *prev , *curr , *reverse_head , *temp; prev = NULL , curr = head; while(curr->next) { temp = curr->next; curr->next = prev; prev = curr; curr = temp; } curr->next = prev; reverse_head = curr; return reverse_head; }
递归:
就是没有想出怎么处理返回的新头结点的同时也逆转链表;因为有答案懒得多想~干脆全局变量,当然这样就不满足原题目的要求了,%>_<%
1 LinkNode *reverse_link_recursive_my(LinkNode *head)//返回逆链表的最后一个元素 2 { 3 if (!head) 4 { 5 rh = NULL; //save the reverse link head(new) rh全局保存新的头结点,挫计... 6 return NULL; 7 } 8 if (head->next == NULL) 9 { 10 rh = head;////save the reverse link head(new) 11 return head; 12 } 13 14 LinkNode *nt; 15 16 nt = reverse_link_recursive_my(head->next); 17 nt->next = head; 18 head->next = NULL; 19 20 return head; 21 }
答案又是如此优雅的解决此问题:
1 LinkNode *reverse_link_recursive(LinkNode *head) 2 { 3 if(head == NULL) 4 return NULL; 5 LinkNode *curr , *reverse_head , *temp; 6 if(head->next == NULL) // 链表中只有一个节点,逆转后的头指针不变 7 return head; 8 else 9 { 10 curr = head; 11 temp = head->next; // temp为(a2,...an)的头指针 12 reverse_head = reverse_link_recursive(temp); // 逆转链表(a2,...an),并返回逆转后的头指针 13 temp->next = curr; // 将a1链接在a2之后 14 curr->next = NULL; 15 } 16 return reverse_head; // (a2,...an)逆转链表的头指针即为(a1,a2,...an)逆转链表的头指针 17 }
思想就是通过每次递归中增加一个变量(temp)保存新的逆链表的尾部,返回就可以直接返回最后遇到的元素的结点;巧~
看了积累还不够啊~
毕