问题描述
我已经将链接列表实现为Java。我创建了所有内容,但是我很难删除具有特定数据的特定节点。它抛出一个 NullPointerException
。我相信,我得到一个 NullPointerException
,因为下一个节点为空。如果有人能指出我正确的方向,这将是伟大的。
I have implemented a Linked List into Java. I have created everything, but I am having difficulty removing a specific node with specific data. It is throwing a NullPointerException
. I believe, I am getting a NullPointerException
because the next node is null. If someone could please point me in the right direction that would be great.
输入
anything
one
two
three
例外:
Exception in thread "main" java.lang.NullPointerException
at LinkedList.remove(LinkedList.java:28)
at Main.main(Main.java:29)
课程:
链接列表类
Classes:Linked list class
public class LinkedList {
// fields
private Node head;
private Node last;
private int size = 0;
// constructor, used when the class is first called
public LinkedList() {
head = last = new Node(null);
}
// add method
public void add(String s) {
last.setNext(new Node(s));
last = last.getNext();
size++;
}
// remove method, if it returns false then the specified index element doens not exist
// otherwise will return true
public boolean remove(String data) {
Node current = head;
last = null;
while(current != null) {
if(current.getData().equals(data)) {
current = current.getNext();
if(last == null) {
last = current;
}else {
last.getNext().setNext(current);
size--;
return true;
}
}else {
last = current;
current = current.getNext();
}
}
return false;
}
//will return the size of the list - will return -1 if list is empty
public int size() {
return size;
}
// will check if the list is empty or not
public boolean isEmpty() {
return true;
}
// @param (index) will get the data at specified index
public String getData(int index) {
if(index <= 0) {
return null;
}
Node current = head.getNext();
for(int i = 1;i < index;i++) {
if(current.getNext() == null) {
return null;
}
current = current.getNext();
}
return current.getData();
}
//@param will check if the arguement passed is in the list
// will return true if the list contains arg otherwise false
public boolean contains(String s) {
for(int i = 1;i<=size();i++) {
if(getData(i).equals(s)) {
return true;
}
}
return false;
}
//@return contents of the list - recursively
public String toString() {
Node current = head.getNext();
String output = "[";
while(current != null) {
output += current.getData()+",";
current = current.getNext();
}
return output+"]";
}
//@return first node
public Node getHead() {
return head;
}
// @return (recursively) list
public void print(Node n) {
if(n == null) {
return;
}else {
System.out.println(n.getData());
print(n.getNext());
}
}
}
主要
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
public static void main(String[] args) throws IOException{
LinkedList list = new LinkedList(); // declaring main linked list
LinkedList b_List = new LinkedList(); // declaring the backup list
String input = null;
// getting input from user, will stop when user has entered 'fin'
while(!(input = br.readLine()).equals("fin")) {
list.add(input); // adding to main list
b_List.add(input);
}
list.print(list.getHead().getNext());
System.out.println("Input Complete.");
if(list.size() == 1) {
System.out.println("You have entered only one name. He/She is the survior");
}else {
System.out.println("Enter the name(s) would like to remove: ");
while(b_List.size() != 1) {
String toRemove = br.readLine();
b_List.remove(toRemove);
}
}
System.out.println("The contestants were: ");
list.print(list.getHead().getNext());
}
}
节点
public class Node {
// Fields
private String data;
private Node next;
// constructor
public Node(String data) {
this(data,null);
}
// constructor two with Node parameter
public Node(String data, Node node) {
this.data = data;
next = node;
}
/**
* Methods below return information about fields within class
* */
// @return the data
public String getData() {
return data;
}
// @param String data to this.data
public void setData(String data) {
this.data = data;
}
// @return next
public Node getNext() {
return next;
}
// @param Node next set to this.next
public void setNext(Node next) {
this.next = next;
}
}
推荐答案
首先,你的头只是一个先行标记,所以你不应该从它开始删除检查。
First of all, your head is just a before-first marker so you shouldn't start the remove check from it.
第二,你的<$ c $如果节点数据 null
第三 - 你的实现是c> remove 方法失败无论如何由于 last.getNext()。setNext(当前)
而被打破 - 它不会将上一个节点与下一个节点链接,它会将当前链接到下一个节点(即无效)
Third - your implementation is broken anyway because of last.getNext().setNext(current)
- it won't link previous node with next, it will link current to next (i.e. will do nothing)
第四 - 由于最后
的神秘操作,它仍然无法移除第一个元素......
Fourth - it still fails to remove first element because of mysterious operations with last
...
正确执行删除
将是这样的:
public boolean remove(String data){
Node current = head.getNext();
Node previous = null;
while (current != null) {
String dataOld = current.getData();
if ((dataOld == null && data == null) || (dataOld != null && dataOld.equals(data))) {
Node afterRemoved = current.getNext();
if (previous == null) {
head.setNext(afterRemoved);
} else {
previous.setNext(afterRemoved);
}
if (afterRemoved.getNext() == null) {
last = afterRemoved;
}
size--;
return true;
} else {
previous = current;
current = current.getNext();
}
}
return false;
}
这篇关于链表实现java的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!