1️⃣ 定义不可变链表
使用 递归枚举是函数式编程中常用方法:
indirect enum LinkedList<Element> {
case empty
case node(Element, LinkedList<Element>)
}
indirect表示枚举的某个 case 可以递归引用自身empty表示链表终点node存储值和指向下一个节点的引用
2️⃣ 实现 append 函数
思路:
- 不可变 → 原链表不修改
- append 返回 新链表
- 递归构建新链表,将原链表的节点复制到新链表尾部
extension LinkedList {
// append 返回一个新链表
func append(_ element: Element) -> LinkedList<Element> {
switch self {
case .empty:
return .node(element, .empty)
case let .node(value, next):
// 保留当前节点,递归 append 到下一个节点
return .node(value, next.append(element))
}
}
// 打印链表(便于测试)
func printList() {
switch self {
case .empty:
print("nil")
case let .node(value, next):
print("(value) -> ", terminator: "")
next.printList()
}
}
}
3️⃣ 测试
var list: LinkedList<Int> = .empty
let list1 = list.append(1)
let list2 = list1.append(2)
let list3 = list2.append(3)
print("list1:")
list1.printList() // 1 -> nil
print("list2:")
list2.printList() // 1 -> 2 -> nil
print("list3:")
list3.printList() // 1 -> 2 -> 3 -> nil
✅ 特点:
- 原链表保持不变
- 每次 append 都返回一个新链表
- 体现不可变数据结构特性
4️⃣ 小结
- 使用
indirect enum可以轻松实现不可变链表 - append 操作递归生成新链表,原链表不受影响
- 可以进一步添加其他函数:
map、filter、reduce等,实现函数式链表操作