惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

I
InfoQ
D
DataBreaches.Net
Engineering at Meta
Engineering at Meta
GbyAI
GbyAI
Martin Fowler
Martin Fowler
Security Latest
Security Latest
Cisco Talos Blog
Cisco Talos Blog
MongoDB | Blog
MongoDB | Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
IT之家
IT之家
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
S
Security Affairs
www.infosecurity-magazine.com
www.infosecurity-magazine.com
博客园_首页
L
LINUX DO - 最新话题
Know Your Adversary
Know Your Adversary
S
Schneier on Security
The Last Watchdog
The Last Watchdog
Attack and Defense Labs
Attack and Defense Labs
T
Tenable Blog
G
GRAHAM CLULEY
Y
Y Combinator Blog
P
Palo Alto Networks Blog
L
LINUX DO - 热门话题
Hugging Face - Blog
Hugging Face - Blog
W
WeLiveSecurity
C
Cybersecurity and Infrastructure Security Agency CISA
aimingoo的专栏
aimingoo的专栏
博客园 - 司徒正美
The Register - Security
The Register - Security
T
The Exploit Database - CXSecurity.com
MyScale Blog
MyScale Blog
M
MIT News - Artificial intelligence
Cyberwarzone
Cyberwarzone
雷峰网
雷峰网
T
Tailwind CSS Blog
V2EX - 技术
V2EX - 技术
T
Threat Research - Cisco Blogs
S
Secure Thoughts
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
O
OpenAI News
C
Cyber Attacks, Cyber Crime and Cyber Security
The Cloudflare Blog
量子位
Apple Machine Learning Research
Apple Machine Learning Research
T
Threatpost
S
SegmentFault 最新的问题
小众软件
小众软件
Google DeepMind News
Google DeepMind News
Help Net Security
Help Net Security

0x01 byte

我在 2025 年看完的书 西班牙之行 2025 年初展望 2024 年底曼谷之行 荐书:The Blind Watchmaker 王垠传播的「自然视力恢复法」真的有用吗? 从高考志愿到职业选择 浅谈 Apple Intelligence 2024 年,我为什么开始为搜索付费 运气与努力 刷新了一下对内容审查粒度的认知 离开心动和 TapTap 如何高效地协作开发:一些 Google 的实践 关于 LeanCloud 被心动/TapTap 收购 small talk #3:从 IPFS 聊到 Web 的开放性 small talk #2:聊聊用 M1 芯片的新 Mac 怀念两位老师:Stan Eisenstat 和 Paul Hudak small talk #1: 聊聊你的私有云 如何在 Emacs 里做所有事 Remark Ninja: 一个简单的评论系统 Woman、man、camera、TV:如何做一个完整的深度学习应用 荐书:走出戈壁:我的中美故事 LeanCloud 开始周期性远程工作了 树莓派:用 Pi-hole 来保护隐私和过滤广告 爱国指南 我在 2019 年觉得不错的几个习惯 WeWork 的兴衰和创投的游戏 计算机专业学生该如何提高自己 怎样利用好路上的时间 荐书:Educated - 一部震撼人心的回忆录 入门 React hooks + 后端集成 荐书:Bad Blood,创业公司的谎言与欺诈 LeanCloud 的故事 — AVOS 时期 一点人生经验 👓 — 如何学英语 一点人生经验 👓 — 学好英语的重要性 Docker 和 Kubernetes 从听过到略懂:给程序员的旋风教程 加密货币与区块链(三):什么是信任 离开微信公众平台 加密货币和区块链(二):分布式共识与去中心化 加密货币和区块链(一):历史的重演 第一个程序员 Ada 的故事 写在 9/11 十五周年 快速开发聊天机器人 说说离职员工的期权 你所不知道的 Dijkstra 你所不知道的冯·诺伊曼 在 LeanCloud 看 Parse 的关闭 对透明薪酬的回顾 比 XCodeGhost 更邪恶的手段 30 年前就出现了 写给创业的技术人 如何有效地做 Code Review 为什么每个团队都需要 Code Review? 怀念我的外公 面向对象与函数式 「零和博弈」- 是语言在演变还是媒体在倒退 编程语言之争 传统媒体和互联网 Clojure: 现实世界的 LISP 求职时的常见错误 Emacs Smart Split (旧文)也说王垠退学
如何反转一个链表?
blog.incoming@1byte.io (江宏) · 2023-05-17 · via 0x01 byte

「如何反转一个链表?」是一个在面试中被问滥的问题。我参与的面试中偶尔也有我们自己的面试官问。 如果你去别的公司面试被问到这个问题,要是给出的答案是(以 Python 为例):

def reverse(l):
  l.reverse()
  return l

或者是:

def reverse(l):
  return l[::-1]

肯定会被拒掉。面试官所预期的是你自己定义节点,再定义链表:

class Node:
    def __init__(self, data):
        self.data = data
        self.next = None

class LinkedList:
    def __init__(self):
        self.head = None
    # 以下略,问 ChatGPT 就可以了。

不过既然是个被问滥的问题,如果遇到不妨尽量给出一个面试官没见过的答案。 比如,构造链表:

def cons(h, t):
    return lambda f: f(h, t)

取头:

def car(l):
    return l(lambda h, _: h)

取尾:

def cdr(l):
    return l(lambda _, t: t)

反转:

def reverse(l):
    rev = lambda l, r: rev(cdr(l), cons(car(l), r)) if l else r
    return rev(l, None)

以上就是完整答案。为了展示方便写个打印链表的函数:

def printl(l):
    toStr = lambda l: str(car(l)) + ' ' + toStr(cdr(l)) if l else ''
    print('(', toStr(l),')')

写个例子试一下:

l = cons(1, cons(2, cons(3, cons(4, None))))
printl(l)
printl(reverse(l))

输出是:

这应该是自己构造链表的最短答案了,但是有一定风险被面试官以奇怪的理由据掉。如果你是面试官,又想问这道题,就得了解各种实现方式,避免把不该拒的人拒了。🙃