如何在不依赖方法的情况下删除链表末尾的节点?

How do I delete a node at the end of a linked list without relying on methods?

我的编码作业 class 要求我在不依赖 SingleLinkedList class 或其任何方法的情况下创建链表。我被困在最后一步,要求我删除链表末尾的节点,只有头和尾引用,我相信我不应该使用 removeLast 方法。

我知道我应该使用带有 while 循环的列表遍历来识别最后一个元素之前的元素,但我不确定如何去做。到目前为止,这是我的所有代码:

public class ListByHand {

private static class Node<E> {
    private E data;
    private Node<E> next;
    private E z;

    private Node(E dataItem) {
        data = z;
        next = null;
    }

    private Node(E dataItem, Node<E> nodeRef) {
        data = dataItem;
        next = nodeRef;
    }
}


public static void main(String[] args) {

    // 1. Created original list containing Bob, Floyd, Mary, and Sue
    Node<String> head = new Node<String>("Bob", null);
    Node<String> nodeRef = head;
    Node<String> tail = head;
    tail.next = new Node<String>("Floyd", null);
    tail = tail.next;
    tail.next = new Node<String>("Mary", null);
    tail = tail.next;
    tail.next = new Node<String>("Sue", null);
    tail = tail.next;

    // Loop to print each name in the node
    while(nodeRef != null) {
        System.out.println(nodeRef.data);
        nodeRef = nodeRef.next;
    }

    // 2. Added Mark to the front of the list
    head = new Node<String>("Mark", head);
    System.out.println(head.data);

    // 3. Deleted the first node in the list
    head = head.next;
    System.out.println(head.data);

    // 4. Added Peter to the end of the list
    tail.next = new Node<String>("Peter", null);
    tail = tail.next;
    System.out.println(tail.data);

    // 5. Deleted the last node in the list

}
}
nodeRef = head;
while (nodeRef.next != tail) nodeRef = nodeRef.next;
nodeRef.next = null;
tail = nodeRef;

这个怎么样。

Node<String> node = head;
while (node.next != null && node.next.next != null) {
    node = node.next;
}

当循环退出时,你应该有倒数第二个节点,对吧?

对于初学者来说,如果可以的话,您还应该在 class 中包括前一个节点。 从那里您可以轻松获取 linkedList 的尾部及其前一个元素。如果不行,请看我回答的第二部分

您将新尾部设置为当前尾部的前一个元素并删除当前尾部,然后开始。

tail = tail->previous;
tail->next = null ;

但是我强烈建议创建添加和删除的方法。

如果你不能使用双链表(没有前一个元素),你需要一个一个地遍历你的节点,直到你到达最后一个(尾部)。从那里你可以很容易地做我上面建议的 但是我不认为将你的最后一个元素(列表的)作为变量有什么意义,因为你不能从那里倒退。但如果那是你的作业,它看起来像这样

Node<String> tmp = head ;
while(tmp->next !=tail){
    tmp= tmp->next;
}
tail = tmp ;
tail->next = null ;