面试 考虑链表反转的递归实现
来源:互联网 发布:linux查看服务器外网ip 编辑:程序博客网 时间:2024/06/15 04:19
这道题是在面试时遇到的,要求实现链表反转的递归版,这道题其实思想非常的简单,而且几行代码就可以实现,但是在面试时出现,这的确如果之前练习的是非递归版的链表反转实现,那么来一个递归版的,可能需要花点时间来适应一下。
以下实现了两个版本的递归版单链表反转,这道题从两个角度看,区别在于,递归调用的返回值是什么,如果递归调用的返回值是输入结点,那么直接在这一层函数连接当前结点,另一个是在下一层调用中完成链表的反转。
// 结点的定义
struct Node {
int value;
Node* next;
Node(int val) : value(val) {}
};
// 传统的方法,在递归调用的下一层完成链表的反转:
class Solution {
public:
// 递归版链表反转
Node* reverseList(Node* node)
{
if (node == NULL || node->next == NULL) return node;
Node* tmp = node->next;
node->next = NULL;
return reverse_list(node, tmp);
}
Node* reverse_list(Node* node1, Node* node2) {
if (node2 == NULL) return node1;
Node* tmp = node2->next;
node2->next = node1;
return reverse_list(node2, tmp);
}
};
Node* lastnode = NULL;
class Solution{
public:
// 另一种递归递归完成链表反转
void reverseList(Node* node) {
if (node == NULL || node->next == NULL) { lastnode = node; return; }
reverse_list(node->next)->next = node;
node->next = NULL;
}
Node* reverse_list(Node* node) {
if (node->next == NULL) { lastnode = node; return node; }
reverse_list(node->next)->next = node;
return node;
}
};
int main()
{
Solution s;
Node* node = new Node(0);
Node* tmp = node;
for (int i = 1; i < 3; i++) {
tmp->next = new Node(i);
tmp = tmp->next;
}
tmp->next = NULL;
s.reverseList(node);
for (int i = 0; i < 3; i++)
{
tmp = lastnode;
lastnode = lastnode->next;
delete tmp;
}
return 0;
}
- 面试 考虑链表反转的递归实现
- C/C++面试程序题(一)——字符串反转、链表反转的递归、非递归实现
- 链表反转的实现(递归反转链表,非递归反转链表)
- C++递归与非递归实现链表的反转
- 链表反转的递归和非递归实现方式
- 链表反转的递归和非递归实现方式
- 递归实现链表反转
- 递归实现链表反转
- 反转链表的迭代实现和递归实现
- 链表的递归反转
- 链表的建立、输出、非递归反转、递归反转
- C递归实现单向链表的反转
- C递归实现单向链表的反转
- C递归实现单向链表的反转
- C递归实现单向链表的反转
- 反转链表:迭代和递归的实现
- 【100题】反转链表(递归实现)
- 反转链表(递归实现)
- 系统级重构的体会
- java枚举使用详解
- UVA10129 Play on Words —— 欧拉回路
- Opencv安装使用的一些问题
- Swift之协议
- 面试 考虑链表反转的递归实现
- 特征工程与文本处理
- 蒟蒻养成记——幼儿园数论(1)
- 深度学习资料资源
- 图像特征提取三大法宝:HOG特征,LBP特征,Haar特征
- Chain of Responsibility模式
- 第三方app内置到system/priv-app或者system/app中无法正常运行的问题。
- 九度 1100 最短路径
- java知识点整理