【问题标题】:Can't add nodes in my linked list (java)无法在我的链表中添加节点(java)
【发布时间】:2015-02-16 21:01:01
【问题描述】:

我已经研究了几个小时的 add 方法,但似乎遇到了障碍。我的方法应该搜索列表中的每个节点以查看是否有匹配的员工编号,如果没有,则按员工编号的顺序添加对象。

不幸的是,我什至无法在列表的开头或结尾添加节点。我想我明白其中的逻辑。我必须在列表中搜索我想要节点的位置,然后我所要做的就是让新节点的链接点成为已经存在的链接点。我认为我要么没有正确创建节点,要么没有正确链接它们。不过,每次我尝试测试我的代码时,我的列表中只会出现一个节点。

    import java.util.*;

public class HumanResources
{

    private EmployeeNode first;
    employee data = new employee();

    private class EmployeeNode
    {

        //data members of employeenode
        private EmployeeNode link;
        employee data = new employee();


        private EmployeeNode()
        {
            data = null;
            link = null;
        }

        private EmployeeNode (employee emp)
        {
            data = emp;
            link = null;
        }


    }


    public EmployeeNode search (employee search)
    {
        EmployeeNode current = first;

        if (first == null)
        { return null;}

        while((present != null) && (present.data != search))
        {
            present = present.link;

        }

        return present;


    }

    private EmployeeNode nextInList(EmployeeNode x)
    {
        return x.link;
    }



   public boolean isEmpty()
   {
      return ( first == null );
   } // end of isEmpty()

    public HumanResources()
    {
        first = null;
    }

    public HumanResources ( employee x)
    {
        this.data = x;
    }






    public boolean addEmployee( employee emp)
    {

        EmployeeNode current = new EmployeeNode();
        current = first;

            if (current == null)
            {
                first = new EmployeeNode(emp);
                return true;

            }
            else
            {
                while(current.link != null)
                {
                    EmployeeNode temp = new EmployeeNode();
                    temp.data = emp;
                    temp.link = current;
                }
                return true;
            }
    }

    public Employee findEmployee(String EmpNumber)
    {
        EmployeeNode current = first;
        if(first == null)
        {
            return null;
        }
        else{
            while (current != null)
            {






    public String toString()
    {
        EmployeeNode display;
        display = first;
        String temp = "";

        while(display != null)
        {
            temp += display.data + "\n";
            display = display.link;

        }
        return temp;
    }


}

这是我的员工类

import java.util.*;
/**
This class manipulate information relating to employees
*/
public class employee {

    private String empNumber;
    private String name;
    private String department;
    private double salary;
    /**
    Zero parameter constructor that sets the values to null
    */
    public employee()
    {
        empNumber = null;
        name = null;
        department = null;
        salary = 0.0;
    }

    /**
    Four parameter constructor to initialize the data members to the give values

    @param kempnumber Employee's ID number
    @param kname Employee's name
    @param kdepartment Employee's department name
    @param ksalary Employee's salary
    */
    public employee(String kempnumber, String kname, String kdepartment, double ksalary)
    {
        empNumber = kempnumber;
        department=kdepartment ;
        name = kname;
        salary = ksalary;

    }
    /**
    copy constructor
    */
    public employee (employee copy)
    {
        empNumber = copy.empNumber;
        name = copy.name;
        department = copy.department;
        salary = copy.salary;

    }
    /**
    Four parameter constructor to set data members to given value
    @param kname Employee's name
    @param kdepartment Employee's department name
    @param ksalary Employee's salary
    */
    public void setEmployee(String kempnumber, String kname, String kdepartment, double ksalary)
    {
        empNumber = kempnumber;
        department=kdepartment ;
        name = kname;
        salary = ksalary;
    }



    public String getEmpNumber() {
        return empNumber;
    }

    public void setEmpNumber(String empNumber) {
        this.empNumber = empNumber;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDepartment() {
        return department;
    }

    public void setDepartment(String department) {
        this.department = department;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary)
    {
        this.salary = salary;
    }

    public String toString()
    {
            return (empNumber + " " + name + " " + department + " " +salary);
    }


    public boolean equals(employee compareto) {

        int firstemployee = Integer.parseInt(empNumber);
        int secondemployee = Integer.parseInt(compareto.empNumber);

        if (firstemployee == secondemployee) {

            return true;
        }

        else {

            return false;
        }

    }


    public int compareTo(employee compareto)
    {
        int less = -1;
        int same = 0;
        int more = 1;
        int firstemployee = Integer.parseInt(empNumber);
        int secondemployee = Integer.parseInt(compareto.empNumber);

            if(firstemployee > secondemployee)
            {
                return more;
            }

            else if(firstemployee == secondemployee)
            {
                return same;
            }

            else
            {
                return less;
            }

        }
    }

【问题讨论】:

  • while(current.link != null) { EmployeeNode temp = new EmployeeNode(); temp.data = emp; temp.link = current; } - 你目前认为这是做什么的?
  • while 循环遍历整个列表直到结束。 Temp 是我要在列表中插入的节点。而且我认为 temp.link = current 将是我如何将临时节点连接到列表中的另一个节点?
  • 为什么你认为while循环会遍历整个列表直到结束?你所拥有的是“当第一个节点有一个链接时(即列表至少有两个节点长),创建新节点并且不对它们做任何事情(所以它们最终会被垃圾收集)”
  • 好的,所以我将条件更改为 (current != null) 并在 while 循环结束时添加 current = current.link 以保持循环循环?另外,由于创建了我的节点,问题是我没有正确地将它们相互链接?
  • 在你的脑海中运行它。循环的作用与您想象的完全不同。

标签: java linked-list nodes


【解决方案1】:

对于 addEmployee 方法,如果要添加到列表的前面,则根本不需要 while 循环。您的“第一个”变量可能正在维护对循环前端的引用,因此您需要做的就是创建员工,更新链接并将“第一个”指向它。像这样的……

public boolean addEmployee( employee emp){

    if (first == null)  {
        first = new EmployeeNode(emp);
        return true;
    }
    else {  // first must != null
        EmployeeNode temp = new EmployeeNode(emp); //create the new employee
        temp.link = first; // link the new employee to the old employee at the front of the list

        first = temp; //update the new front of list to be the new employee
        return true;
    }
}

请记住,如果您想将其添加到列表的 end,您将需要一个 while 循环来搜索列表并在创建新员工和更新链接。

如果您对链接感到困惑,请尝试单步执行代码并用线条绘制节点以表示链接,以帮助您习惯于可视化链接列表。

【讨论】:

  • 谢谢你的帮助,我想我终于设法把它弄清楚了一点。
猜你喜欢
  • 2022-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多