反转一个单链表,迭代和递归实现
2013-04-03 16:19
141 查看
搜狐2012.9.15校园招聘会笔试题
编程题:
写代码,反转一个单链表,分别以迭代和递归的形式来实现
// 返回新链表头节点
LinkNode *reverse_link(LinkNode *head)
LinkNode *reverse_link_recursive(LinkNode *head)
真不难简单,可有些细节的东西就是不会处理。。。。⊙﹏⊙b
迭代:
虽然没有问题的,可是对一些临界条件处理就不如别如此优雅:
递归:
就是没有想出怎么处理返回的新头结点的同时也逆转链表;因为有答案懒得多想~干脆全局变量,当然这样就不满足原题目的要求了,%>_<%
答案又是如此优雅的解决此问题:
思想就是通过每次递归中增加一个变量(temp)保存新的逆链表的尾部,返回就可以直接返回最后遇到的元素的结点;巧~
看了积累还不够啊~
毕
编程题:
写代码,反转一个单链表,分别以迭代和递归的形式来实现
typedef struct node LinkNode; struct node { int data; LinkNode* next; };
// 返回新链表头节点
LinkNode *reverse_link(LinkNode *head)
LinkNode *reverse_link_recursive(LinkNode *head)
真不难简单,可有些细节的东西就是不会处理。。。。⊙﹏⊙b
迭代:
LinkNode *reverse_link_my(LinkNode *head) { LinkNode *p, *nh, *q; if (!head) { return NULL; } p = head; nh = p->next; if (!nh) { return p; } q = nh->next; p->next = NULL; while(q) { nh->next = p; p = nh; nh = q; q = q->next; } nh->next = p; return nh; }
虽然没有问题的,可是对一些临界条件处理就不如别如此优雅:
// 返回新链表头节点 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; }
递归:
就是没有想出怎么处理返回的新头结点的同时也逆转链表;因为有答案懒得多想~干脆全局变量,当然这样就不满足原题目的要求了,%>_<%
LinkNode *reverse_link_recursive_my(LinkNode *head)//返回逆链表的最后一个元素 { if (!head) { rh = NULL; //save the reverse link head(new) rh全局保存新的头结点,挫计... return NULL; } if (head->next == NULL) { rh = head;////save the reverse link head(new) return head; } LinkNode *nt; nt = reverse_link_recursive_my(head->next); nt->next = head; head->next = NULL; return head; }
答案又是如此优雅的解决此问题:
LinkNode *reverse_link_recursive(LinkNode *head) { if(head == NULL) return NULL; LinkNode *curr , *reverse_head , *temp; if(head->next == NULL) // 链表中只有一个节点,逆转后的头指针不变 return head; else { curr = head; temp = head->next; // temp为(a2,...an)的头指针 reverse_head = reverse_link_recursive(temp); // 逆转链表(a2,...an),并返回逆转后的头指针 temp->next = curr; // 将a1链接在a2之后 curr->next = NULL; } return reverse_head; // (a2,...an)逆转链表的头指针即为(a1,a2,...an)逆转链表的头指针 }
思想就是通过每次递归中增加一个变量(temp)保存新的逆链表的尾部,返回就可以直接返回最后遇到的元素的结点;巧~
看了积累还不够啊~
毕
相关文章推荐
- 写代码,反转一个单链表,分别以迭代和递归的形式来实现
- 反转一个单链表,分别以迭代和递归的形式来实现
- 反转一个单链表的循环和递归实现
- 反转一个单链表的循环和递归实现
- [置顶] 单链表反转的递归与非递归实现
- 单链表的反转(用循环和递归实现单链表反转)
- 单链表反转的递归实现(Reversing a Linked List in Java, recursively)
- 单链表反转的递归实现(Reversing a Linked List in Java, recursively)
- python用递归实现反转一个整型数(记2017腾讯测试工程师面试)
- c语言,递归翻转一个单链表,c实现单链表
- 一个JavaScript递归实现反转数组字符串的实例
- 编写查找一个单链表特定元素的程序。分别使用递归和非递归方法实现,并比较它们的运行时间。
- 每天一个JavaScript实例-递归实现反转数组字符串
- 每天一个JavaScript实例-递归实现反转数组字符串
- 【LeetCode-面试算法经典-Java实现】【206-Reverse Linked List(反转一个单链表)】
- 反转链表的迭代实现和递归实现
- 用两种递归思路与循环实现单链表的反转
- 反转链表:迭代和递归的实现
- 递归,迭代,堆栈三种方式实现单链表反转(C++)
- 一个JavaScript递归实现反转数组字符串的实例