对《算法导论》中双向链表LIST-DELETE伪代码的理解疑问
《算法导论》双向链表LIST-DELETE伪代码解惑
先回顾书中的双向链表定义:
- 每个元素x包含两个指针:
x.next指向后继节点,x.prev指向前驱节点 - 当
x.prev = NIL时,x是头节点;当x.next = NIL时,x是尾节点 L.head指向链表头节点,若L.head = NIL则链表为空
书中给出的删除元素x的LIST-DELETE伪代码:
LIST-DELETE(L,x) 1 if x.prev!= NIL 2 x.prev.next = x.next 3 else L.head = x.next 4 if x.next != NIL 5 x.next.prev = x.prev
你的两个困惑解答:
对
x.prev.next = x.next的误解
你把x.prev.next当成了返回x地址的"函数返回值",这是错的。这里的x.prev是x的前驱节点,x.prev.next是这个前驱节点里存储的后继指针——原本这个指针指向x,现在把它改成指向x的后继节点x.next,目的是把x从链表的连接链中断开,让前驱直接和后继相连,和x = x.next完全不是同一个操作。伪代码如何处理内存中的x元素
这段伪代码只完成逻辑删除:让整个链表不再有任何节点引用x,这样x就从链表的结构里消失了。至于实际释放x占用的内存空间,这属于编程语言实现层面的操作——比如在C/C++里需要手动调用free(x),Java里由垃圾回收机制自动处理。算法导论的伪代码聚焦于数据结构的核心逻辑,不会把这类语言相关的内存回收细节写进去。
内容的提问来源于stack exchange,提问作者Thomas Finley
相关产品推荐
相关产品推荐

