简体   繁体   English

双链表中removeElement()的指针问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM