逆序打印不可变链表
难度:
标签:
题目描述
代码结果
运行时间: 26 ms, 内存: 0.0 MB
/*
* 思路:
* 不可变链表的节点无法被修改,所以无法使用典型的链表操作。
* 使用递归实现链表的逆序打印,并结合Java Stream API。
*/
// 定义链表节点的接口
interface ImmutableListNode {
void printValue(); // 打印当前节点的值
ImmutableListNode getNext(); // 获取下一个节点
}
public class Solution {
public void printLinkedListInReverse(ImmutableListNode head) {
// 使用递归的方式来收集链表节点
List<ImmutableListNode> nodes = new ArrayList<>();
collectNodes(head, nodes);
// 逆序打印链表节点
nodes.stream()
.sorted(Comparator.comparingInt(node -> -nodes.indexOf(node)))
.forEach(ImmutableListNode::printValue);
}
private void collectNodes(ImmutableListNode node, List<ImmutableListNode> nodes) {
if (node != null) {
nodes.add(node);
collectNodes(node.getNext(), nodes);
}
}
}
解释
方法:
该题解的思路是使用一个列表来存储从头节点开始的所有节点,然后逆序打印这些节点的值。首先,题解通过一个while循环遍历链表,并将除了头节点之外的所有节点添加到列表中。之后,使用另一个while循环,从列表中逐个弹出节点,并调用节点的printValue方法来逆序打印节点的值。最后,题解打印了最初的头节点的值,因为头节点没有被添加到列表中。
时间复杂度:
O(n)
空间复杂度:
O(n)
代码细节讲解
🦆
为什么题解中将头节点的值最后打印,而不是直接将其也添加到列表中一并处理?
▷🦆
在题解中使用列表存储节点,然后逆序打印的方法是否最优?是否有其他不需要额外存储空间的方法?
▷🦆
题解中使用的`pop()`函数默认从列表的哪一端移除元素?这是基于什么考虑?
▷