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

Java 如何在不依赖方法的情况下删除链表末尾的节点?,java,data-structures,linked-list,nodes,singly-linked-list,Java,Data Structures,Linked List,Nodes,Singly Linked List,我的编码类有一个任务,要求我创建一个链表,而不依赖SingleLinkedList类或其任何方法。我陷入了最后一个步骤,该步骤要求我删除链接列表末尾只有头和尾引用的节点,我相信我不应该使用removeLast方法 我知道我应该使用带有while循环的列表遍历来识别最后一个元素之前的元素,但我不知道如何进行。以下是我迄今为止的所有代码: public class ListByHand { private static class Node<E> { private E dat

我的编码类有一个任务,要求我创建一个链表,而不依赖
SingleLinkedList
类或其任何方法。我陷入了最后一个步骤,该步骤要求我删除链接列表末尾只有头和尾引用的节点,我相信我不应该使用
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

}
}
公共类列表手动{
私有静态类节点{
私人电子数据;
私有节点下一步;
私人EZ;
专用节点(E数据项){
数据=z;
next=null;
}
专用节点(E数据项、节点节点ref){
数据=数据项;
next=nodeRef;
}
}
公共静态void main(字符串[]args){
//1.创建包含Bob、Floyd、Mary和Sue的原始列表
节点头=新节点(“Bob”,null);
Node nodeRef=头部;
节尾=头;
tail.next=新节点(“Floyd”,null);
tail=tail.next;
tail.next=新节点(“Mary”,null);
tail=tail.next;
tail.next=新节点(“Sue”,null);
tail=tail.next;
//循环以打印节点中的每个名称
while(nodeRef!=null){
System.out.println(nodeRef.data);
nodeRef=nodeRef.next;
}
//2.在列表前面添加了标记
头部=新节点(“标记”,头部);
系统输出打印项次(表头数据);
//3.删除列表中的第一个节点
head=head.next;
系统输出打印项次(表头数据);
//4.将彼得添加到列表的末尾
tail.next=新节点(“Peter”,null);
tail=tail.next;
System.out.println(tail.data);
//5.删除了列表中的最后一个节点
}
}
这个怎么样

Node<String> node = head;
while (node.next != null && node.next.next != null) {
    node = node.next;
}
Node=head;
while(node.next!=null&&node.next.next!=null){
node=node.next;
}
当循环退出时,您应该拥有倒数第二个节点,对吗?

这个怎么样

Node<String> node = head;
while (node.next != null && node.next.next != null) {
    node = node.next;
}
Node=head;
while(node.next!=null&&node.next.next!=null){
node=node.next;
}
当循环退出时,您应该拥有倒数第二个节点,对吗?

这个怎么样

Node<String> node = head;
while (node.next != null && node.next.next != null) {
    node = node.next;
}
Node=head;
while(node.next!=null&&node.next.next!=null){
node=node.next;
}
当循环退出时,您应该拥有倒数第二个节点,对吗?

这个怎么样

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

当循环退出时,您应该拥有倒数第二个节点,对吗?

对于初学者,如果可以,您还应该在类中包含上一个节点。 从那里,您可以轻松地获取linkedList的尾部及其上一个元素。如果你不能,请看我回答的第二部分

将新尾部设置为当前尾部的上一个元素,然后删除当前尾部,现在开始

tail = tail->previous;
tail->next = null ;
然而,我强烈建议创建添加和删除的方法

如果不能使用双链接列表(没有前面的元素),则需要逐个迭代节点,直到到达最后一个(尾部)。从那里你可以很容易地做到我上面的建议 然而,我不认为把列表中的最后一个元素作为变量有什么意义,因为你不能从那里倒退。但如果你的任务是这样的话

Node<String> tmp = head ;
while(tmp->next !=tail){
    tmp= tmp->next;
}
tail = tmp ;
tail->next = null ;
节点tmp=头部;
while(tmp->next!=尾部){
tmp=tmp->next;
}
tail=tmp;
tail->next=null;

对于初学者,如果可以,还应该在类中包含上一个节点。 从那里,您可以轻松地获取linkedList的尾部及其上一个元素。如果你不能,请看我回答的第二部分

将新尾部设置为当前尾部的上一个元素,然后删除当前尾部,现在开始

tail = tail->previous;
tail->next = null ;
然而,我强烈建议创建添加和删除的方法

如果不能使用双链接列表(没有前面的元素),则需要逐个迭代节点,直到到达最后一个(尾部)。从那里你可以很容易地做到我上面的建议 然而,我不认为把列表中的最后一个元素作为变量有什么意义,因为你不能从那里倒退。但如果你的任务是这样的话

Node<String> tmp = head ;
while(tmp->next !=tail){
    tmp= tmp->next;
}
tail = tmp ;
tail->next = null ;
节点tmp=头部;
while(tmp->next!=尾部){
tmp=tmp->next;
}
tail=tmp;
tail->next=null;

对于初学者,如果可以,还应该在类中包含上一个节点。 从那里,您可以轻松地获取linkedList的尾部及其上一个元素。如果你不能,请看我回答的第二部分

将新尾部设置为当前尾部的上一个元素,然后删除当前尾部,现在开始

tail = tail->previous;
tail->next = null ;
然而,我强烈建议创建添加和删除的方法

如果不能使用双链接列表(没有前面的元素),则需要逐个迭代节点,直到到达最后一个(尾部)。从那里你可以很容易地做到我上面的建议 然而,我不认为把列表中的最后一个元素作为变量有什么意义,因为你不能从那里倒退。但如果你的任务是这样的话

Node<String> tmp = head ;
while(tmp->next !=tail){
    tmp= tmp->next;
}
tail = tmp ;
tail->next = null ;
节点tmp=头部;
while(tmp->next!=尾部){
tmp=tmp->next;
}
tail=tmp;
tail->next=null;

对于初学者,如果可以,还应该在类中包含上一个节点。 从那里,您可以轻松地获取linkedList的尾部及其上一个元素。如果你不能,请看我回答的第二部分

将新尾部设置为当前尾部的上一个元素,然后删除当前尾部,现在开始

tail = tail->previous;
tail->next = null ;
然而,我强烈建议创建添加和删除的方法

如果不能使用双链接列表(没有前面的元素),则需要遍历节点o