有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

双链接列表中removeElement()的指针存在java问题

关于如何使用类类型元素的对象的上一个和下一个实例变量修改指针,我遇到了一些问题。双链接列表中填充了元素对象,其中包含lastName、firstName、phoneNumber、previous和next实例变量。removeElement方法接受lastName作为参数,并查找具有该字符串的元素,然后将其从列表中删除。然而,当修改应该从列表中删除元素的指针时,我遇到了一个异常。具体而言,在这段代码中:

previousNode.nextElement = currentNode.nextElement;
currentNode = currentNode.nextElement;
currentNode.previousElement = previousNode;

它在删除中间的一个节点之后尝试删除一个节点,然后尝试删除列表末尾的节点。因此,我肯定没有正确地修改实例变量以链接已删除元素之前和之后的元素。在遵循程序约束的同时,如何设置上一个和下一个元素的指针

下面是代码,以防它有助于回答问题:

    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();
      }
   }
}

或者为了方便起见,仅使用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
         }
      }
   }

作业(跳到任务5):https://drive.google.com/file/d/1POEAsdNrB3wJPI0ddsbJp2HnUay5pgei/view?usp=sharing

任何答复都将不胜感激


共 (1) 个答案

  1. # 1 楼答案

    从列表中删除最后一个元素时会出现问题

    按如下方式更新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;
            }
        }
    }