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