我必须在链接列表中实现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;
}
}
答案 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 方法中存在三个问题。
- 节点newNode = null; newNode 对象是一个空引用,它不引用Node 的对象, 您可以将其更改为节点newNode = new Node(value,null)
- 在 while循环之后,head将使用最后一个Node对象进行引用,你的工作只会让head使用新的Node对象进行引用,它不起作用到列表self,因为这个新对象没有列表。
- 在此方法之后,head将引用Node的新对象而不是List的第一个。
醇>
另一种解决方案:
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
。现在,您的insertAtLast
为O(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;
}