Java自定义LinkedList尾插节点陷入死循环问题求助
问题分析与解决方案
死循环原因
你的add_simple方法存在两个关键错误,直接导致死循环:
- 首次添加节点形成自引用环:当链表为空时,设置
first_node=newNode后,执行last_node.next = newNode,此时last_node就是first_node,相当于把第一个节点的next指向自身,形成了环。后续调用方法时,while (null != last_node.next)会无限循环(因为节点的next永远指向自己)。 - 未正确利用
last_node成员变量:每次添加都将last_node重置为first_node,然后从头遍历找尾节点,既低效又完全浪费了已有的尾节点引用。
代码修正
修正WA7_List.java的add_simple方法
直接利用last_node快速完成尾插,避免遍历和自引用问题:
public class WA7_List { private LinkedNode first_node; private LinkedNode last_node; private LinkedNode[] shortcuts; private int count_shortcuts; private int count_nodes; private int M; public WA7_List(int M) { this.first_node = null; this.last_node = null; this.shortcuts = null; this.count_nodes = 0; this.count_shortcuts = 0; this.M = M; } public void add_simple(double item) { LinkedNode newNode = new LinkedNode(null, item); if (first_node == null) { // 链表为空时,首尾节点均指向新节点 first_node = newNode; last_node = newNode; } else { // 链表非空时,直接在尾节点后追加新节点,更新尾节点引用 last_node.next = newNode; last_node = newNode; } count_nodes += 1; // 每次添加都更新节点计数 } // 其他方法保持不变 }
修正Project.java的语法错误
原代码存在参数定义、数组初始化、变量作用域的问题,修正后如下:
public class Project{ public static void main(String[] args) { // 正确初始化double数组 double[] all_inserts = new double[]{0.76697, 0.08368, 0.37785, 0.07386, 0.77287}; int M = 5; // 定义M的具体值(可根据需求修改) WA7_List linked_list = new WA7_List(M); for (int i=0; i<all_inserts.length; i++) { linked_list.add_simple(all_inserts[i]); } } }
修正说明
- 利用
last_node直接定位尾节点,避免了从头遍历的低效操作,同时彻底解决了自引用导致的死循环问题。 - 统一在方法末尾递增
count_nodes,保证节点计数的准确性。 - 修正了
Project.java中的语法错误,确保代码可以正常编译运行。
内容的提问来源于stack exchange,提问作者rzan1
相关产品推荐
相关产品推荐

