随手记记

259 阅读1分钟

这篇记录一些有意思的小东西

链表递归反转

reverse :: [a] -> [a]
reverse [] = []
reverse [x : xs] = reverse[xs] ++ [x]

Haskell的反转实现,翻译成人话

function reverse (node) {
    if (node == null || node->next == null) {
        return node
    }
    let newHead = reverse(node->next)
    node->next->next = node
    node->next = null
    return newHead
}
  • 返回永远是最后一个节点,也就是新的头结点
  • 每轮递归的node->next已经是一个反转好的节点

这是第二次递归返回时的链表,此时4、5已经reverse,H在3时不需要考虑5的情况,只需要把3和4reverse。