没有最后一个节点的LinkedList的实现

问题描述

我被要求重新实现一个链表而不使用尾部。因此,我必须更改其方法,以使其无需使用尾节点即可工作。

removeLast方法使我感到困惑:这是我尝试做的,但是并没有删除该节点。

我的尝试怎么了?

public E removeLast()
{
    if(isEmpty()) return null;
    Node<E> temp=head;

    while (temp.getNext()!=null) {
        temp=temp.getNext();
    }
    E a=temp.getData();
    temp=null;
    size--;
    // if(head==temp)
    if (head.getNext()==null)
        head=null;

    return a;
}   

测试类

public static void main(String arg[]) {
    LinkedListWm<Integer> r = new LinkedListWm<>();
    r.addFirst(1);
    r.addFirst(3);
    r.addFirst(7);
    r.addFirst(50);
    r.addLast(5);
    System.out.println(r.last());
    System.out.println(r.first());
    r.removeLast();
    System.out.println(r.last());
    r.removeFirst();
    r.display();
}

解决方法

您需要跟踪temp之前的节点。通过将其next属性设置为null,您将需要它在上一个节点结束列表。

当前,您尝试使用以下方法做到这一点:

temp = null;

...但是这只是清除变量temp的内容。它不会更改列表。为此,您必须更改next属性。

因此,定义一个prev之后的temp变量:

Node<E> prev = null;

while (temp.getNext()!=null) {
    prev = temp;
    temp = temp.getNext();
}

而不是:

temp = null;

做:

prev.next = null;

当然,后者只能在prev不为null时,换句话说,当head不是最后一个节点(即temp)时发生。

所以综合考虑:

public E removeLast()
{
    if (isEmpty()) return null;
    Node<E> prev = null;
    Node<E> temp = head;
    
    while (temp.getNext() != null) {
        prev = temp;
        temp = temp.getNext();
    }
    
    size--;
    if (prev == null)
        head = null;
    else
        prev.next = null;
        
    return temp.getData();
}