【问题标题】:Adding to the tail of a linked list添加到链表的尾部
【发布时间】:2019-07-17 19:07:48
【问题描述】:

我的链表有一个 append 方法,我想在其中添加到尾部,但是当将新节点添加到链表时,headNode 和 tailNode 都成为新插入的节点。如何让 headNode 保持作为进入列表的第一个节点,而不是让它成为与 tailNode 相同的东西。

 public static void append()
{
 for(int x = 0; x < gradeArray.length; x++)
 {
   if(gradeArray[x] < 70)
   {
     StudentNode newNode = new StudentNode(nameArray[x], gradeArray[x], null);
     if(headNode == null)
     {
       headNode = newNode;
     }
     else
     {
       tailNode.nextNode = newNode;
     }
     tailNode = newNode;
}
 }
 }

【问题讨论】:

  • 当您调用 append() 时,您确定头节点未重置为 null 吗?能否在 append 方法中记录头节点和尾节点,看看它们是否为空?
  • headNode 在类中声明为:private static StudentNode headNode = null;
  • 是否打算在应用程序范围内只能有一个链表(因为static)?
  • 是的,只有一个链表
  • 您是否曾多次在该方法所在的位置创建此类? headNode 变量在这个类中的任何地方都发生过变化吗?

标签: java linked-list nodes singly-linked-list


【解决方案1】:

我不确定你在做什么错,但请看下面这段代码工作得很好。

    public class Grades {

    public static String[] nameArray = new String[50];
    public static int[] gradeArray = new int[50];

    public static StudentNode headNode;
    public static StudentNode tailNode;

    public static void append() {
        for (int x = 0; x < gradeArray.length; x++) {
            if (gradeArray[x] < 70) {

                String name = nameArray[x];
                int grade = gradeArray[x];
                StudentNode newNode = new StudentNode(name, grade, null);
                if (headNode == null) {
                    headNode = newNode;
                } else {
                    tailNode.nextNode = newNode;
                }
                tailNode = newNode;
            }
        }
    }

    public static void main(String[] args) throws java.lang.Exception {
        for (int i = 0; i < 50; i++) {
            nameArray[i] = "name-" + i;
            gradeArray[i] = i;
        }

        append();

        for(int i=0; i<50; i++) {
            nameArray[i] = "name-" + (i + 50);
            gradeArray[i] = i + 50;
        }

        append();

        System.out.println(headNode.toString());
        System.out.println(tailNode.toString());
    }
 }

 class StudentNode {

    public int grade;
    public String name;
    public StudentNode nextNode;

    public StudentNode(String n, int g, StudentNode sn) {
        name = n;
        grade = g;
        nextNode = sn;
    }

    public String toString() {
        return name + ", " + grade;
    }
}

即使您更改等级和姓名数组并再次运行追加,它仍然保持头部正确。

Ideone link for running code

【讨论】:

    【解决方案2】:

    你为什么附加这个声明? tailNode = newNode;

    想象一下,线程通过if(headNode == null) 他将 newNode 地址分配给 headNode 。之后,tailNode = newNode; 被执行,tail 指向 newNode。 最后,tailNode 和 headNode 指向同一个对象:newNode。

    我认为你必须删除这条声明tailNode = newNode;

    【讨论】:

    • 第一个添加的节点是并且应该同时是head和tail,这是正确的。
    • 当我把那条线拿出来时,它仍然会做同样的事情。
    猜你喜欢
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多