ultimo - insertar ordenado lista enlazada java
Eliminar el Ășltimo nodo de una lista vinculada (10)
Estoy practicando el trabajo con nodos de listas vinculadas y me he encontrado con un problema que no sé cómo responder. ¿Cómo se puede eliminar el último nodo en una lista vinculada? El siguiente código funciona para todas las entradas del último nodo. El último no se borra.
Clase de nodo
public class Node {
private String data;
private Node next;
Node(String data, Node next)
{
this.data = data;
this.next = next;
}
public void setData(String d)
{
data = d;
}
public void setNext(Node n)
{
next = n;
}
public String getData()
{
return data;
}
public Node getNext()
{
return next;
}
Principal
Node list = new Node("NODE 1",new Node("NODE 2",new Node("NODE 3", null)));
list = insertSecond(list,"New Node");
list = addLast(list,"LAST NODE");
printList(list);
System.out.println();
deleteNode(list,"LAST NODE");
printList(list);
}
public static Node deleteNode(Node list,String str)
{
Node temp = list;
Node prev = list;
while(temp.getNext() != null)
{
if(temp.getData().equals(str))
{
if(prev.getNext() == null)
prev.setNext(null);
else{
prev.setNext(prev.getNext().getNext());
}
}
prev = temp;
temp = temp.getNext();
}
Eliminar un nodo en una lista individualmente vinculada
Suposiciones
- Cada nodo en la lista tiene un puntero
nextNode
. - El puntero
headOfList
apunta al primer nodo en la lista. - El siguiente puntero de cada nodo, que ya está en la lista, es correcto.
- El siguiente puntero del último nodo en la lista es algún valor significativo (por ejemplo, nulo).
Pasos para implementar
- Si la lista está vacía, hecho. Nodo deseado no encontrado.
- Si el primer nodo es el nodo deseado, establezca el puntero
headOfList
en el valorheadOfList->nextNode
. Hecho. Nodo deseado encontrado. - Establezca el puntero
currentNode
igual al valor del punteroheadOfList
. - Si el nodo
currentNode
es el último nodo. Hecho. Nodo deseado no encontrado. - Si el nodo
currentNode->nextNode
es el nodo deseado, establezca el valorcurrentNode->nextNode
en el valorcurrentNode->nextNode->nextNode
. Hecho. Nodo deseado encontrado. - ve al paso 4.
Notas
Como se trata de una lista vinculada por separado, no puede hacer una copia de seguridad. Debido a esto, debe apuntar al nodo principal y verificar si el nodo hijo es el nodo que desea eliminar. Habrá condiciones de boundry.
Cierto código
Esta es una función miembro de una clase LinkedList. startOfList es un miembro de la clase y apunta al comienzo de la lista vinculada.
public boolean delete(final String target)
{
if (startOfList != null)
{
if (StringUtils.equals(startOfList.getData(), target))
{
startOfList = startOfList.getNext();
return true;
}
Node current = startOfList;
for (Node next = current.getNext(); next != null; next = current.getNext())
{
if (StringUtils.equals(next.getData(), target))
{
current.setNext(next.getNext());
return true;
}
else // advance one node.
{
current = next;
}
}
}
return false;
}
Es más fácil si usa una Lista doblemente enlazada, donde su lista conoce tanto el inicio como el final.
Entonces puedes hacer algo como esto:
public void removeLastItem(){
this.lastNode = this.lastNode.prev;
}
Esta es una técnica muy simple que utilicé para eliminar el último nodo.
public void deleteLast() {
Node curr = null;
for (curr = this.first; curr.next.next != null;curr = curr.next) {
}
curr.next = null;
}
Este es mi intento con la suposición de que la siguiente variable del último nodo siempre será nula:
public class LastNodeRemoval {
private static class Node {
String item;
Node next;
}
public static void main(String[] args) {
Node third = new Node();
third.item = "Third";
Node second = new Node();
second.item = "Second";
second.next = third;
Node first = new Node();
first.item = "First";
first.next = second;
removalLastNode(first);
}
private static void removalLastNode(Node first) {
Node temp = first;
while(temp.next.next != null) {
temp = temp.next;
}
temp.next = null;
System.out.println("Last node: "+temp.item);
}
}
Este trabajó para mí ...
public void removeLastNode(){
System.out.println("/n Inside removeLastNode");
next=firstLink;
prev=firstLink;
if(next == null) System.out.println("/n The link List is Empty");
while(next.getNext()!=null) {
prev=next;
next=next.getNext();
}
prev.setNext(null);
}
Esto se puede hacer de una manera mucho más simple usando la clase contenedor de Java "LinkedList". La clase LinkedList en Java implementa la interfaz Deque (cola de doble finalización) que admite obtener / agregar / eliminar métodos Primero / Último. Un fragmento de código elemental sigue:
LinkedList<Integer> list = new LinkedList<Integer>();
list.addFirst(1);
list.addLast(2);
System.out.println(list.removeLast());
La lógica es simple aquí y es lo mismo que obtener el último nodo. Lo difícil aquí es cuando llegue al último nodo, tendrá que recordar el nodo antes de la última y establecerlo en nulo para que sea el último nodo nuevo. En el siguiente código cuando llegue al último elemento que será n2, obtenga n1 y establézcalo en nulo.
public void removeLast(){
if(head==null) System.out.println("List is empty");
else {
Node n1 = null;
Node n2 = head;
while(n2.next != null)
{
n1 = n2;
n2 = n2.next;
}
n1.next = null;
}
Necesitas algo como esto:
public static Node deleteNode(Node list, String str) {
Node temp = list;
Node prev = list;
do {
if (temp.getData().equals(str)) {
if (prev.getNext() == null) {
prev.setNext(null);
} else {
prev.setNext(prev.getNext().getNext());
}
}
prev = temp;
temp = temp.getNext();
} while (temp != null);
return list;
}
Estabas deteniendo tu ciclo demasiado temprano.
Por cierto: if (prev.getNext() == null) { prev.setNext(null); ...
if (prev.getNext() == null) { prev.setNext(null); ...
no tiene sentido, pero te dejaré ese error.
Supongo que while(temp.getNext() != null)
falla para su último elemento. El último elemento no tendrá un next
elemento. Entonces el último elemento no se compara con la cadena pasada. Debe rastrear esto con el depurador.
while(temp != null){
prev = temp;
temp = temp.getNext();
}
prev.next = null;
Prueba esto: