#java
#java
Вопрос:
Я написал код для удаления узла из связанного списка с заданным ключом. Однако, когда я пытаюсь удалить первый узел здесь, а затем просмотреть мой список, он по-прежнему показывает первый узел, который существовал ранее. Может кто-нибудь сказать мне, что я здесь делаю не так? Весь мой код, начинающийся с имени класса
public class LinkedList {
//removing Node nested class
public void buildList1() {
head=new Node(1);
head.next=new Node(3);
head.next.next=new Node(5);
head.next.next.next=new Node(7);
}
public boolean removeNode(Node head,int x) {
//1 3 5 7---to delete 5
Node q=head;//q
// Node p=head.next;//p
Node prev=null;
if(q!=null amp;amp; q.data==x) {
head=q.next;
//q=null;
System.out.println("next to head" head.data);
return true;
}
while(q!=null amp;amp; q.data!=x) {
prev=q;
q=q.next;
}
if(q==null)
return false;
prev.next=q.next;
return true;
}
public void printList()
{
Node tnode = head;
while (tnode != null)
{
System.out.print(tnode.data " ");
tnode = tnode.next;
}
}
public static void main(String args[]) {
LinkedList list=new LinkedList();
list.buildList1();
list.printList();
System.out.println(list.removeNode(list.head, 1));
list.printList();
}
}
Комментарии:
1. В сторону:
if(q.data==x amp;amp; q!=null)
условия здесь должны быть перевернуты2. Можете ли вы предоставить более полный набор вашего кода? Можете ли вы опубликовать, как выглядит весь ваш класс LinkedList? Ваш
removeNode
метод не должен принимать головной узел в качестве параметра. Головной узел должен быть переменной экземпляра класса LinkedList.3. Ваш
LinkedList
класс должен отслеживать свой собственныйhead
, а не принимать его в качестве параметра (для любого из своих методов) — поэтому он должен начинаться какpublic class LinkedList { private Node head; ...}
Ответ №1:
у @JD D был хороший ответ, но я бы сделал removeNode
метод еще проще.
public boolean removeNode(int x) {
tempNode = this.head;
prevNode = null;
if (this.head != null amp;amp; this.head.data == x) {
this.head = this.head.next;
return true;
}
while (tempNode != null) {
if (tempNode.data == x) {
prevNode.next = tempNode.next;
return true;
}
prevNode = tempNode;
tempNode = tempNode.next;
}
return false;
}
Комментарии:
1. вы должны поместить
if (this.head.date == x)
логику перед циклом … нет причин запускать эту проверку в каждом цикле, поскольку она не меняется2. это верно, но это должно быть двойное условие,
if (this.head != null amp;amp; this.head.data == x)
иначе оно выдаст a,NullPointerException
еслиList
будет пустым
Ответ №2:
Добавьте head в качестве переменной экземпляра и удалите этот параметр из вашей функции removeNode. Вы должны иметь возможность ссылаться на эту переменную в своих методах, используя this
ключевое слово.
Что-то вроде этого (непроверено, но надеюсь, вы поняли идею):
public class LinkedList {
//removing Node nested class
private Node head;
public void buildList1() {
this.head=new Node(1);
this.head.next=new Node(3);
this.head.next.next=new Node(5);
this.head.next.next.next=new Node(7);
}
public boolean removeNode(int x) {
Node q=this.head;
Node prev=null;
if(q!=null amp;amp; q.data==x) {
this.head=q.next;
return true;
}
while(q!=null amp;amp; q.data!=x) {
prev=q;
q=q.next;
}
if(q==null)
return false;
prev.next=q.next;
return true;
}
public void printList()
{
Node tnode = this.head;
while (tnode != null)
{
System.out.print(tnode.data " ");
tnode = tnode.next;
}
}
public static void main(String args[]) {
LinkedList list=new LinkedList();
list.buildList1();
list.printList();
System.out.println(list.removeNode(1));
list.printList();
}
}
Ответ №3:
public static void main(String args[]) {
LinkedList list=new LinkedList();
list.buildList1();
list.printList();
list.remove(2);
list.printList();
}
LinkedList имеет библиотеку методов, одним из которых является remove (int index). Используйте его, как показано.
Комментарии:
1. Во встроенном классе нет такого понятия, как buildList1() или printList(). Я думаю, что это какой-то пользовательский класс для школьного проекта или что-то в этом роде.
2. В этом случае я бы посоветовал посмотреть исходный код unlink (узел<E> x). и манипулировать им в соответствии с вашим случаем.
3. Очевидно, что это личный / школьный проект. Использование встроенных библиотек противоречит цели.
Ответ №4:
Ваша жизнь будет проще, если ваш head
узел не будет вашим первым узлом, а ваш первый реальный узел будет next
вашим (исправленным) head
.
Таким образом, вам не понадобится специальный код для обработки случая, когда удаляется первый (реальный) узел.
Ответ №5:
Попробуйте напрямую использовать список, который вы создали. Возможны два решения. Во-первых: используйте созданный список
if (q != null amp;amp; q.data == x) {
this.head = q.next;//use this to refer the list you created
// q=null;
System.out.println("next to head" head.data);
return true;
}
Второе: передать сам список
public boolean removeNode(LinkedList list, int x) {
// 1 3 5 7---to delete 5
Node q = list.head;// q
}
//Call it like this
System.out.println(list.removeNode(list, 1));