3-9.【函数式编程】实现一个不可变链表(immutable linked list)并写一个 append 函数返回新链表

2 阅读1分钟

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 操作递归生成新链表,原链表不受影响
  • 可以进一步添加其他函数:mapfilterreduce 等,实现函数式链表操作