如何在不依赖方法的情况下删除链表末尾的节点?
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 ;
我的编码作业 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 ;