Java双向链表操作结果存疑:执行指定代码后为何与预期不符?
初始链表结构
存储单词algorithm的双向链表共9个字符节点,加上头节点list(不存储字符),节点顺序及指针指向如下:list → [a] ←→ [l(p1)] ←→ [g] ←→ [o] ←→ [r] ←→ [i(p2)] ←→ [t(p3)] ←→ [h] ←→ [m]
逐行代码执行分析
p2.next.prev = p2.prev;
p2指向[i]节点,p2.next是[t]节点,将[t]的prev指针改为指向[i]的prev节点[r],此时[r]与[t]建立前向关联,[i]暂时失去后向链接。p2.prev.next = p2.next;
将[r]的next指针改为指向[t]节点,彻底将[i]从原链表中移除,此时链表变为:list→ [a] ←→ [l] ←→ [g] ←→ [o] ←→ [r] ←→ [t] ←→ [h] ←→ [m],[i]成为游离节点。p2.next = p3.next;
p3指向[t]节点,p3.next是[h]节点,将游离的[i]的next指针指向[h]。p3.next.prev = p2;
将[h]的prev指针改为指向[i],建立[i]与[h]的双向链接。p3.next = p2;
将[t]的next指针改为指向[i],此时[t] → [i] → [h]。p2.prev = p3;
将[i]的prev指针改为指向[t],完成[t]与[i]的双向链接,链表更新为:list→ [a] ←→ [l] ←→ [g] ←→ [o] ←→ [r] ←→ [t] ←→ [i] ←→ [h] ←→ [m]list.next.next = p1.next;
list.next是[a]节点,p1指向[l]节点且p1.next是[g]节点,将[a]的next指针改为直接指向[g],跳过[l]节点。p1.next.prev = list.next;
将[g]的prev指针改为指向[a],完成[a]与[g]的双向链接,彻底移除[l]节点,此时链表变为:list→ [a] ←→ [g] ←→ [o] ←→ [r] ←→ [t] ←→ [i] ←→ [h] ←→ [m]p1 = null;和System.gc();
仅将p1置空并触发垃圾回收,不改变有效链表结构。
最终结果
将节点字符按顺序拼接,得到字符串 agortihm。你的推导结果是正确的,大概率是测验系统判分错误,或者题目存在表述歧义。
内容的提问来源于stack exchange,提问作者Yoo

