#java
#java
Вопрос:
Я видел, что есть некоторые вопросы по этому вопросу, но ситуация здесь немного иная, в то время как другие вопросы касаются класса Java linked-list, это пользовательский класс, который я получил от своего учителя с некоторыми специфическими атрибутами.
Итак, что мне нужно сделать, это написать метод с именем ‘RemoveAt’, который получает ‘int k’ и удаляет объект с индексом ‘k’ и возвращает элемент ‘data’ удаленного объекта…
моя проблема в том, что после нахождения объекта я хочу его удалить (в основном удалить его указатель на следующий узел списка ..), И кажется, что есть некоторые недостающие атрибуты, и он не сказал добавлять новые.
это мой код:
public class List {
private ListNode firstNode;
private ListNode lastNode;
private String name;
public List()
{
this("list");
}
public List(String listName)
{
name=listName;
firstNode=lastNode=null;
}
//override
public String toString()
{
String stringToReturn = "";
ListNode currentNode = firstNode;
while (currentNode != null) {
stringToReturn = currentNode.toString();
currentNode = currentNode.getNext();
if (currentNode != null) {
stringToReturn = ", ";
}
}
return stringToReturn;
}
public Object removeAt(int k) throws ListIndexOutOfBound
{
ListNode removedNode = this.firstNode;
Object removedObject;
int idx = 0;
if (isEmpty())
throw new EmptyListException(this.name);
if (k < 0)
throw new ListIndexOutOfBound();
if (k == 0) {
removedObject = this.removeFromFront();
} else {
while (idx != k) {
removedNode = removedNode.getNext();
idx ;
if (removedNode == null)
throw new ListIndexOutOfBound();
}
if (removedNode == this.lastNode) {
removedNode = (ListNode) this.removeFromBack();
} else {
removedObject = removedNode.data;
//i'm stuck here...I want to remove this node from the list!
}
}
return removedNode;
}
Существует также класс ListNode, который выглядит следующим образом:
public class ListNode {
Object data;
ListNode nextNode;
public ListNode(Object o){
this(o,null);
}
public ListNode(Object o,ListNode node){
data=o;
nextNode=node;
}
public Object getObject(){
return data;
}
public ListNode getNext(){
return nextNode;
}
}
Как бы вы предложили это сделать?
Комментарии:
1. В Java есть gc, поэтому просто удалите все ссылки на него и ваше благо. Однако не все элементы являются листовыми. Итак, вам приходится иметь дело с 1-2-3, где вы хотите удалить 2. Подумайте об этом. Кроме того, спросите своего учителя, почему вы не используете дженерики.
2. Как мне удалить ссылку на него? Это мой вопрос @ChiefTwoPencils
Ответ №1:
Я бы посоветовал вам всегда помнить узел перед удаляемым узлом, чтобы установить следующий узел после удаления нужного узла:
if (k == 0) {
removedObject = this.removeFromFront();
} else {
ListNode prev = null;
while (idx != k) {
prev = removedNode;
removedNode = removedNode.getNext();
idx ;
if (removedNode == null)
throw new ListIndexOutOfBound();
}
if (removedNode == this.lastNode) {
removedNode = (ListNode) this.removeFromBack();
} else {
removedObject = removedNode.data;
prev.setNext(removedNode.getNext());
}
}
Это означает, что вам нужно будет добавить метод setNext(ListNode next)
к ListNode
объекту.
public void setNext(ListNode next){
nextNode = next;
}
Что это делает, так это установка nextNode
prev
на removedNode.getNext()
| | prev.getNext() | removedNode.getNext() |
--------------------------------------------------------------------
| prev | removedNode | <any node> or null |
После:
| | prev.nextNode() | (<any node>.nextNode())? |
--------------------------------------------------------------------
| prev | <any node> or null | ... |
Комментарии:
1. но в ListNode у меня есть атрибут с именем ‘nextNode’, поэтому я не могу просто сказать ‘prev.nextNode = removedNode.GetNext;’? вместо создания нового метода @StefanFalk
2. Ну, вы можете, если это так
public
. В этом случае вам не понадобитсяsetNode(ListNode next)
метод.