如何在链表中最后插入元素

时间:2016-09-25 05:23:46

标签: java linked-list

我必须在链接列表中实现insertAtLast()

我在为insertAtLast()编写的代码中遇到了Null Pointer Exception。可能是因为我错了。

如何正确访问它并进行插入?

class myLinkedList {
private static class Node 
{
    private int data; 
    private Node next;

    public Node(int data, Node next) 
    {
        this.data = data;
        this.next = next; 
    }
}

private Node head;

// Constructs an empty list
public myLinkedList() 
{
    head = null; 
}

// Returns true if the list is empty otherwise returns false
public boolean isEmpty() 
{
    return (head == null); 
}

// Inserts a new node at the beginning of this list.    
public void insertAtBeginning(int element) 
{
    head = new Node(element, head); 
}

// Returns the first element in the list.
public int getFirstElement() 
{
    if(head == null) 
    {
        System.out.println("Empty linked list"); 
        throw new IndexOutOfBoundsException();
    }
    return head.data; 
}

// Removes the first node in the list.
public int removeFirstNode() 
{ 
    int tmp = getFirstElement(); 
    head = head.next;
    return tmp;
}

// Empties linked list 
public void clear() 
{
    head = null; 
}

// Returns the length of the linked list
public static int LLlength(Node head)
{ 
    int length = 0;
    Node currentNode = head; 

    while(currentNode != null)
    {
        length++;
        currentNode = currentNode.next; 
    }
    return length; 
}

// Displays the linked list elements
public static void display(Node head)
{ 
    if(head == null) 
    {
        System.out.println("Empty linked list");
        throw new IndexOutOfBoundsException(); 
    }

    Node currentNode = head; 

    while(currentNode != null)
    {
        System.out.print(currentNode.data+" ");
        currentNode = currentNode.next; 
    }
    System.out.println();
}

// Displays the linked list elements in reverse order 
public static void displayReverse(Node head)
{
    if(head == null){} 
    else
    {
        Node currentNode = head; 
        displayReverse(currentNode.next); 
        System.out.print(currentNode.data+" ");
    } 
}
//Displays the linked list's last element
public static int getLastElement(Node head)
{
    Node currentNode = head; 

    while(currentNode.next != null)
    {
        currentNode = currentNode.next; 
    }
    return currentNode.data;
}
public static void insertAtLast(Node head,int element)
{
    Node newNode=null;
    newNode.data = element;
    newNode.next = null;
    while(head.next != null)
    {
        head = head.next; 
    }
    head = newNode;
    //return head;

}

//Tells if a sepeific element is in the Linked List or not
public static boolean searchFor(Node head, int element)
{
    Node currentNode = head; 
    boolean flag = false;
    while(currentNode != null)
    {
        if (currentNode.data == element)
        {
            flag = true;
            break;
        } 
        currentNode = currentNode.next;
    }
    return flag;
}

} 

3 个答案:

答案 0 :(得分:1)

查看声明节点对象newNode的方式。您将其设置为null而不是将其实例化为实际对象。请记住,null表示空引用。因此,接下来的两行代码会给你一个错误,因为你试图访问“nothing”的成员变量。由于您有一个Node类和构造函数,请使用它而不是您现在正在执行的操作。最后,使用指向head的temp变量并使用该temp指针遍历节点。因为在之前的内容中,您可以将头部设置为指向链接列表中的新对象,这是最后一个元素而不是第一个元素,

public static void insertAtLast(Node head,int element)
{
    Node newNode= new Node(element,null);
    Node temp = head;
    while(temp.next != null)
    {
        temp = temp.next; 
    }
    temp.next = newNode;
    //return head;

}

答案 1 :(得分:1)

  

insertAtLast 方法中存在三个问题。

  
      
  1. 节点newNode = null;    newNode 对象是一个空引用,它不引用Node 的对象,   您可以将其更改为节点newNode = new Node(value,null)
  2.   
  3. while循环之后,head将使用最后一个Node对象进行引用,你的工作只会让head使用新的Node对象进行引用,它不起作用到列表self,因为这个新对象没有列表。
  4.   
  5. 在此方法之后,head将引用Node的新对象而不是List的第一个。
  6.   

另一种解决方案:

public static void insertAtLast(Node head,int element)
{
   Node newNode=new Node(0,null);
   newNode.data = element;
   newNode.next = null;
   Node temp = head;
   while(temp.next != null)
   {
       temp = temp.next; 
   }
   temp.next = newNode;
  //return head;
}

答案 2 :(得分:0)

首先,为什么你的一些方法static?它们是一种类方法而不是static方法。

如果您想支持添加到链接列表的末尾,我建议您跟踪列表的tail。现在,您的insertAtLastO(n),您可以通过存储指向链接列表末尾的指针轻松将其更改为O(1)

但它会增加许多其他方法的复杂性。因此,如果您决定使用tail指针,则可能必须更新其他的。我不打算了解其他方法的详细信息,但只会告诉您非静态 insertAtLast,如果您有tail指针,它会是什么样子。

public void insertAtLast(int element)
{
    Node newNode = new Node(element,null);

    if (head == null){ // you need to check for head, it may be null
       head = newNode;
    }

    if (tail == null){ // also, maybe there is no tail currently.
       tail = newNode;
       return;
    }

    //there is an existing tail, update it
    tail.next = newNode;
    tail = newNode;
}