You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

跑步者里程追踪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();
      }
            
   }
}

问题原因

打印逻辑存在两个致命错误:

  1. headNode是初始化的哑头节点,本身没有有效数据(miles=0.0,date为空),直接打印它必然输出错误值
  2. 调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 21:01:02