跑步者里程追踪LinkedList程序持续返回0.0问题排查求助
问题排查:链表打印始终输出0.0的原因与修复
问题描述
实现里程追踪链表时,输入节点数据后,打印结果始终是0.0, ,而非预期的里程和日期数据。示例输入与预期输出如下:
输入:
3
2.2
7/2/18
3.2
7/7/18
4.5
7/16/18预期输出:
2.2, 7/2/18
3.2, 7/7/18
4.5, 7/16/18实际输出:
0.0,
0.0,
0.0,
现有代码
MileageTrackerNode.java
public class MileageTrackerNode { private double miles; // Node data private String date; // Node data private MileageTrackerNode nextNodeRef; // Reference to the next node public MileageTrackerNode() { miles = 0.0; date = ""; nextNodeRef = null; } // Constructor public MileageTrackerNode(double milesInit, String dateInit) { this.miles = milesInit; this.date = dateInit; this.nextNodeRef = null; } // Constructor public MileageTrackerNode(double milesInit, String dateInit, MileageTrackerNode nextLoc) { this.miles = milesInit; this.date = dateInit; this.nextNodeRef = nextLoc; } /* Insert node after this node. Before: this -- next After: this -- node -- next */ public void insertAfter(MileageTrackerNode nodeLoc) { MileageTrackerNode tmpNext; tmpNext = this.nextNodeRef; this.nextNodeRef = nodeLoc; nodeLoc.nextNodeRef = tmpNext; } // Get location pointed by nextNodeRef public MileageTrackerNode getNext() { return this.nextNodeRef; } public void printNodeData() { System.out.println(this.miles + ", " + this.date); } }
MileageTrackerLinkedList.java
import java.util.Scanner; public class MileageTrackerLinkedList { public static void main (String[] args) { Scanner scnr = new Scanner(System.in); // References for MileageTrackerNode objects MileageTrackerNode headNode; MileageTrackerNode currNode; MileageTrackerNode lastNode; double miles; String date; int i; int numNodes; // Front of nodes list headNode = new MileageTrackerNode(); lastNode = headNode; // TODO: Scan the number of nodes numNodes = scnr.nextInt(); // TODO: For the scanned number of nodes, scan // in data and insert into the linked list for (i = 0; i < numNodes; ++i) { miles = scnr.nextDouble(); date = scnr.next(); currNode = new MileageTrackerNode(miles, date); lastNode.insertAfter(currNode); lastNode = currNode; } // TODO: Call the printNodeData() method // to print the entire linked list for (i = 0; i < numNodes; ++i) { headNode.printNodeData(); headNode.getNext(); } } }
问题原因
打印逻辑存在两个致命错误:
headNode是初始化的哑头节点,本身没有有效数据(miles=0.0,date为空),直接打印它必然输出错误值- 调用
headNode.getNext()后,没有将返回的下一个节点赋值回变量,导致每次循环都还是操作原哑头节点,永远无法访问到输入的有效节点
修复方案
修改打印链表的代码块,从哑头节点的下一个节点开始遍历,并且每次更新当前节点指针:
// TODO: Call the printNodeData() method // to print the entire linked list currNode = headNode.getNext(); // 跳转到第一个有效节点 for (i = 0; i < numNodes; ++i) { currNode.printNodeData(); currNode = currNode.getNext(); // 移动到下一个节点 }
或者更健壮的while循环(无需依赖节点数):
currNode = headNode.getNext(); while (currNode != null) { currNode.printNodeData(); currNode = currNode.getNext(); }
修复原理
哑头节点的作用是简化链表操作,本身不存储业务数据。遍历打印时需要跳过它,从它指向的第一个有效节点开始,依次移动指针遍历所有节点,才能正确输出输入的里程和日期信息。
内容的提问来源于stack exchange,提问作者AllDevs
相关产品推荐
相关产品推荐

