[英]Issues with pointers for removeElement() in Doubly Linked List
I'm having issues as to how to modify the pointers, using the previous and next instance variables of an object of class type Element. 我在使用类类型Element的对象的上一个和下一个实例变量来修改指针方面遇到问题。 The doubly linked list is filled with Element objects with a lastName, firstName, phoneNumber, previous, and next instance variables.
双链列表中填充了具有lastName,firstName,phoneNumber,上一个和下一个实例变量的Element对象。 The removeElement method accepts the lastName as a parameter and finds an element with that exact String and then deletes it from the list.
removeElement方法接受lastName作为参数,并找到具有该确切String的元素,然后将其从列表中删除。 However, when modifying the pointers that are supposed to delete the Element from the list I came across an exception.
但是,在修改应该从列表中删除Element的指针时,遇到了一个异常。 Specifically, at this block of code:
具体来说,在此代码块中:
previousNode.nextElement = currentNode.nextElement;
currentNode = currentNode.nextElement;
currentNode.previousElement = previousNode;
It throws an exception after deleting a node in the middle and then trying to delete the node at the end of the list. 在删除中间的节点然后尝试删除列表末尾的节点后,它将引发异常。 So I'm definitely not properly modifying the instance variables to link the elements previous and next to the deleted element.
因此,我绝对不能正确地修改实例变量,以链接已删除元素之前和之后的元素。 How could I set the pointers of both the previous and next elements towards each other, while following the constraints of the program?
在遵循程序约束的同时,如何设置上一个元素和下一个元素的指针彼此相对?
Here's the code in case it will contribute to an answer: 以下是可能有助于回答的代码:
package linkedlist;
import java.util.Scanner;
class Element
{
String firstName;
String lastName;
long phoneNumber;
Element nextElement; // Pointer to next element in the list
Element previousElement; // Pointer to the last element in the list
// Default Constructor
public Element()
{
this.firstName = null;
this.lastName = null;
this.phoneNumber = 0;
this.nextElement = null;
this.previousElement = null;
}
// Constructor providing first and last name
public Element( String first, String last, long number )
{
this.firstName = first;
this.lastName = last;
this.phoneNumber = number;
this.nextElement = null;
this.previousElement = null;
}
public String toString()
{
return( this.firstName + " " + this.lastName + " Cell: " + this.phoneNumber);
}
}
class ElementList
{
Element firstNode;
Element lastNode;
public ElementList()
{
this.firstNode = null;
this.lastNode = null;
}
public void addElement( String first, String last, long number )
{
Element newNode;
newNode = new Element( first, last, number );
if ( this.firstNode == null)
{
this.firstNode = newNode;
this.lastNode = newNode;
}
else
{
this.lastNode.nextElement = newNode;
newNode.previousElement = this.lastNode;
this.lastNode = newNode;
}
}
public void deleteElement( String last )
{
Element currentNode, previousNode = null;
currentNode = this.firstNode; //Temporarily assigns it
while( currentNode != null ) //Checks if there's items.
{
if ( currentNode.lastName.equalsIgnoreCase( last ) == true ) //Checks the last name
{
// We want to delete this node
if ( this.firstNode == currentNode )
{
// Delete first Node, point first node to next element
this.firstNode = this.firstNode.nextElement;
}
else
{
/* Point the next element of the previous element to the next element
of the current element, thus deleting the current element
*/
previousNode.nextElement = currentNode.nextElement;
currentNode = currentNode.nextElement;
currentNode.previousElement = previousNode;
}
break;
}
else
{
// Move to next element
previousNode = currentNode; // Save current node to previous
currentNode = currentNode.nextElement; // Move to next node
}
}
}
public void printElements()
{
Element currentNode;
System.out.println( "\nList of Elements\n================");
if ( this.firstNode == null )
{
System.out.println( "No Elements in List\n" );
}
else
{
currentNode = this.firstNode; // Point to first element
while ( currentNode != null ) // Traverse entire list
{
System.out.println( currentNode ); // Print Element contents
currentNode = currentNode.nextElement; // Go to next node
}
}
}
public void printReverseElements()
{
Element currentNode;
System.out.println( "\nList of Elements in Reverse\n================");
if(this.lastNode == null)
{
System.out.println("No Elements in List\n");
}
else
{
currentNode = this.lastNode;
while (currentNode != null)
{
System.out.println(currentNode);
currentNode = currentNode.previousElement;
}
}
}
}
public class LinkedList
{
public static void main(String[] args)
{
Scanner keyboard = new Scanner( System.in );
ElementList list;
String first, last;
double number;
list = new ElementList(); // Instantiate the ElementList
System.out.print( "Enter Last Name, <CR> to Exit : " );
last = keyboard.nextLine(); // Read last Name
while ( last.length() != 0 )
{
System.out.print( "Enter First Name : " );
first = keyboard.nextLine(); // Read first Name
System.out.print("Enter Phone Number : ");
number = keyboard.nextLong();
list.addElement(first, last, (long) number);
list.printElements();// Add Element to ElementList
if ( keyboard.hasNextLine())
{
keyboard.nextLine();
}
System.out.print( "Enter Last Name, <CR> to Exit : " );
last = keyboard.nextLine();
}
list.printElements();
list.printReverseElements();
System.out.print( "Enter Last Name to Delete or <CR> to Exit: " );
last = keyboard.nextLine();
while ( last.length() != 0 )
{
list.deleteElement( last );
list.printElements();
System.out.print( "Enter Last Name to Delete or <CR> to Exit: " );
last = keyboard.nextLine();
}
}
}
or just the removeElement method for convenience: 或仅为方便起见,使用removeElement方法:
public void deleteElement( String last )
{
Element currentNode, previousNode = null;
currentNode = this.firstNode; //Temporarily assigns it
while( currentNode != null ) //Checks if there's items.
{
if ( currentNode.lastName.equalsIgnoreCase( last ) == true ) //Checks the last name
{
// We want to delete this node
if ( this.firstNode == currentNode )
{
// Delete first Node, point first node to next element
this.firstNode = this.firstNode.nextElement;
}
else
{
/* Point the next element of the previous element to the next element
of the current element, thus deleting the current element
*/
previousNode.nextElement = currentNode.nextElement;
currentNode = currentNode.nextElement;
currentNode.previousElement = previousNode;
}
break;
}
else
{
// Move to next element
previousNode = currentNode; // Save current node to previous
currentNode = currentNode.nextElement; // Move to next node
}
}
}
The assignment as well (skip to task 5): https://drive.google.com/file/d/1POEAsdNrB3wJPI0ddsbJp2HnUay5pgei/view?usp=sharing 分配(也跳至任务5): https : //drive.google.com/file/d/1POEAsdNrB3wJPI0ddsbJp2HnUay5pgei/view?usp=sharing
Any answer will be appreciated! 任何答案将不胜感激!
The problem occurs when you are removing last element from the list. 当您从列表中删除最后一个元素时,会发生此问题。
Update firstNode, lastNode objects as follows: 如下更新firstNode,lastNode对象:
public void deleteElement(String last) {
Element currentNode, previousNode = null;
currentNode = this.firstNode;
while (currentNode != null) {
if (currentNode.lastName.equalsIgnoreCase(last) == true) {
if (this.firstNode == currentNode) {
this.firstNode = this.firstNode.nextElement;
if (this.firstNode != null) {
this.firstNode.previousElement = null;
} else {
this.lastNode = null;
}
} else {
previousNode.nextElement = currentNode.nextElement;
if (currentNode.nextElement != null) {
currentNode = currentNode.nextElement;
currentNode.previousElement = previousNode;
} else {
this.lastNode = previousNode;
}
}
break;
} else {
previousNode = currentNode;
currentNode = currentNode.nextElement;
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.