如何实现一个高效的单向链表逆序输出?
0. 需要考虑因素,高效应权衡多方面因素
- 数据量是否会很大
- 空间是否有限制
- 原始链表的结构是否可以更改
- 时间复杂度是否有限制
- 一个链表节点需要输出的元素有多个,例如链表中存的是自定义对象,有多个字段
1. 直接递归(简单,但O(n)空间复杂度不支持大数据量)
// 直接递归实现核心代码片段
public void reverse(head){
// 递归终止条件
if(head.next == null){
print(head);
return;
}
// 下一层需要做的事儿
reverse(head.next);
// 本层需要做的事儿
print(head);
}
2. 采用栈进行存储(O(n)时间复杂度,但不支持大数据量,栈中需要存储所有节点)
// 采用栈进行存储实现核心代码片段
public void reverse(head){
Node cur = head;
// 将所有元素入栈
while(cur != null){
stack.push(cur);
cur = cur.next;
}
// 将所有元素出栈
while(!stack.isEmpty){
print(stack.poll);
}
}
3. 直接遍历(不需要额外存储空间,但O(n^2)时间复杂度)
// 直接遍历实现核心