无法在我的链表中添加节点 (java)

Can't add nodes in my linked list (java)

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

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

    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;
    }


}

这是我的员工class

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;
            }

        }
    }

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

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 循环来搜索列表并在创建列表之前找到结尾新员工并更新链接。

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