2017-03-21 20 views
1

我有這個類叫Sorting,它接受用戶的一組整數,將它們存儲在一個鏈表中,然後檢查它們是否以遞增順序存儲。如何將這個鏈表存儲在一個對象數組中?

現在它有能力接受一個整數列表並存儲它,然後檢查它是否被排序。我需要能夠存儲兩個單獨的列表並檢查它們,但我不知道如何去存儲它們。

我假設我應該將它存儲在一個對象數組中,但是如何才能將類對象存儲在存儲數組中?

這裏的排序類:

import java.util.Scanner; 

public class Sorting { 

    public static IntNode[] storage = new IntNode[2]; 

    public static void main(String[] args) { 
     Scanner input = new Scanner(System.in); 

     IntNode head; 
     head = new IntNode(0, null); 
     int headCounter = 0; 
     int searchNumber = 0; 
     int nextInt; 
     int storageNumber = 0; 

     System.out.println("Please enter a seqeunce of integer numbers. When you are finished, enter a negative number"); 
     while (input.hasNextInt()) { 
      nextInt = input.nextInt(); 
      if (nextInt >= 0) { 
       if (headCounter == 0) { 
        head = new IntNode(nextInt, null); 
        searchNumber = nextInt; 
        headCounter++; 
        storageNumber++; 
       } else { 
        IntNode selection = IntNode.listSearch(head, searchNumber); 
        selection.addNodeAfter(nextInt); 
        searchNumber = nextInt; 
        storageNumber++; 
       } 
      } else { 
       headCounter = 0; 
      } 
     } 

     for (IntNode cursor = head; cursor != null; cursor = cursor.getLink()) 
     System.out.print(cursor.getData() + " "); 

     System.out.println(isSorted(head)); 

    } 
    // Checks the linked list to see if the integers are sorted in increasing order 
    // @param IntNode head 
    //  The head of the linked list being checked 
    // @return 
    //  The method returns true if the linked list is sorted in increasing order, and false if the 
    //  list is not sorted in an increasing order 
    public static boolean isSorted(IntNode head) { 
     int numCheckPrevious = 0; 
     for (IntNode cursor = head; cursor != null; cursor = cursor.getLink()) { 
      if (cursor.getData() > numCheckPrevious) { 
       numCheckPrevious = cursor.getData(); 
       continue; 
      } else { 
       return false; 
      } 
     } 
     return true; 
    } 
} 

這裏是存儲在一個鏈表的整數IntNode類:

// File: IntNode.java 
/****************************************************************************** 
* An IntNode provides a node for a linked list with 
* integer data in each node. 
* 
* @note 
* Lists of nodes can be made of any length, limited only by the amount of 
* free memory in the heap. But beyond Integer.MAX_VALUE (2,147,483,647), 
* the answer from listLength is incorrect because of arithmetic 
* overflow. 
******************************************************************************/ 
public class IntNode 
{ 
    // Invariant of the IntNode class: 
    // 1. The node's integer data is in the instance variable data. 
    // 2. For the final node of a list, the link part is null. 
    //  Otherwise, the link part is a reference to the 
    //  next node of the list. 
    private int data; 
    private IntNode link; 


    /** 
    * Initialize a node with a specified initial data and link to the next 
    * node. Note that the initialLink may be the null reference, 
    * which indicates that the new node has nothing after it. 
    * @param initialData 
    * the initial data of this new node 
    * @param initialLink 
    * a reference to the node after this new node--this reference may be null 
    * to indicate that there is no node after this new node. 
    * @postcondition 
    * This node contains the specified data and link to the next node. 
    **/ 
    public IntNode(int initialData, IntNode initialLink) 
    { 
     data = initialData; 
     link = initialLink; 
    } 


    /** 
    * Modification method to add a new node after this node. 
    * @param item 
    * the data to place in the new node 
    * @postcondition 
    * A new node has been created and placed after this node. 
    * The data for the new node is item. Any other nodes 
    * that used to be after this node are now after the new node. 
    * @exception OutOfMemoryError 
    * Indicates that there is insufficient memory for a new 
    * IntNode. 
    **/ 
    public void addNodeAfter(int item) 
    { 
     link = new IntNode(item, link); 
    }   


    /** 
    * Accessor method to get the data from this node. 
    * @param - none 
    * @return 
    * the data from this node 
    **/ 
    public int getData() 
    { 
     return data; 
    } 


    /** 
    * Accessor method to get a reference to the next node after this node. 
    * @param - none 
    * @return 
    * a reference to the node after this node (or the null reference if there 
    * is nothing after this node) 
    **/ 
    public IntNode getLink() 
    { 
     return link;            
    } 


    /** 
    * Copy a list. 
    * @param source 
    * the head of a linked list that will be copied (which may be 
    * an empty list in where source is null) 
    * @return 
    * The method has made a copy of the linked list starting at 
    * source. The return value is the head reference for the 
    * copy. 
    * @exception OutOfMemoryError 
    * Indicates that there is insufficient memory for the new list. 
    **/ 
    public static IntNode listCopy(IntNode source) 
    { 
     IntNode copyHead; 
     IntNode copyTail; 

     // Handle the special case of the empty list. 
     if (source == null) 
     return null; 

     // Make the first node for the newly created list. 
     copyHead = new IntNode(source.data, null); 
     copyTail = copyHead; 

     // Make the rest of the nodes for the newly created list. 
     while (source.link != null) 
     { 
     source = source.link; 
     copyTail.addNodeAfter(source.data); 
     copyTail = copyTail.link; 
     } 

     // Return the head reference for the new list. 
    return copyHead; // * This node contains the specified data and link to the next node. 

    } 


    /** 
    * Copy a list, returning both a head and tail reference for the copy. 
    * @param source 
    * the head of a linked list that will be copied (which may be 
    * an empty list in where source is null) 
    * @return 
    * The method has made a copy of the linked list starting at 
    * source. The return value is an 
    * array where the [0] element is a head reference for the copy and the [1] 
    * element is a tail reference for the copy. 
    * @exception OutOfMemoryError 
    * Indicates that there is insufficient memory for the new list. 
    **/ 
    public static IntNode[ ] listCopyWithTail(IntNode source) 
    { 
     IntNode copyHead; 
     IntNode copyTail; 
     IntNode[ ] answer = new IntNode[2]; 

     // Handle the special case of the empty list. 
     if (source == null) 
     return answer; // The answer has two null references . 

     // Make the first node for the newly created list. 
     copyHead = new IntNode(source.data, null); 
     copyTail = copyHead; 

     // Make the rest of the nodes for the newly created list. 
     while (source.link != null) 
     { 
     source = source.link; 
     copyTail.addNodeAfter(source.data); 
     copyTail = copyTail.link; 
     } 

     // Return the head and tail references. 
     answer[0] = copyHead; 
     answer[1] = copyTail; 
     return answer; 
    } 


    /** 
    * Compute the number of nodes in a linked list. 
    * @param head 
    * the head reference for a linked list (which may be an empty list 
    * with a null head) 
    * @return 
    * the number of nodes in the list with the given head 
    * @note 
    * A wrong answer occurs for lists longer than Int.MAX_VALUE.  
    **/ 
    public static int listLength(IntNode head) 
    { 
     IntNode cursor; 
     int answer; 

     answer = 0; 
     for (cursor = head; cursor != null; cursor = cursor.link) 
     answer++; 

     return answer; 
    } 


    /** 
    * Copy part of a list, providing a head and tail reference for the new copy. 
    * @param start/end 
    * references to two nodes of a linked list 
    * @param copyHead/copyTail 
    * the method sets these to refer to the head and tail node of the new 
    * list that is created 
    * @precondition 
    * start and end are non-null references to nodes 
    * on the same linked list, 
    * with the start node at or before the end node. 
    * @return 
    * The method has made a copy of the part of a linked list, from the 
    * specified start node to the specified end node. The return value is an 
    * array where the [0] component is a head reference for the copy and the 
    * [1] component is a tail reference for the copy. 
    * @exception IllegalArgumentException 
    * Indicates that start and end are not references 
    * to nodes on the same list. 
    * @exception NullPointerException 
    * Indicates that start is null. 
    * @exception OutOfMemoryError 
    * Indicates that there is insufficient memory for the new list.  
    **/ 
    public static IntNode[ ] listPart(IntNode start, IntNode end) 
    { 
     IntNode copyHead; 
     IntNode copyTail; 
     IntNode cursor; 
     IntNode[ ] answer = new IntNode[2]; 

     // Make the first node for the newly created list. Notice that this will 
     // cause a NullPointerException if start is null. 
     copyHead = new IntNode(start.data, null); 
     copyTail = copyHead; 
     cursor = start; 

     // Make the rest of the nodes for the newly created list. 
     while (cursor != end) 
     { 
     cursor = cursor.link; 
     if (cursor == null) 
      throw new IllegalArgumentException 
      ("end node was not found on the list"); 
     copyTail.addNodeAfter(cursor.data); 
     copyTail = copyTail.link; 
     } 

     // Return the head and tail references 
     answer[0] = copyHead; 
     answer[1] = copyTail; 
     return answer; 
    }   


    /** 
    * Find a node at a specified position in a linked list. 
    * @param head 
    * the head reference for a linked list (which may be an empty list in 
    * which case the head is null) 
    * @param position 
    * a node number 
    * @precondition 
    * position > 0. 
    * @return 
    * The return value is a reference to the node at the specified position in 
    * the list. (The head node is position 1, the next node is position 2, and 
    * so on.) If there is no such position (because the list is too short), 
    * then the null reference is returned. 
    * @exception IllegalArgumentException 
    * Indicates that position is not positive.  
    **/ 
    public static IntNode listPosition(IntNode head, int position) 
    { 
     IntNode cursor; 
     int i; 

     if (position <= 0) 
      throw new IllegalArgumentException("position is not positive"); 

     cursor = head; 
     for (i = 1; (i < position) && (cursor != null); i++) 
     cursor = cursor.link; 

     return cursor; 
    } 


    /** 
    * Search for a particular piece of data in a linked list. 
    * @param head 
    * the head reference for a linked list (which may be an empty list in 
    * which case the head is null) 
    * @param target 
    * a piece of data to search for 
    * @return 
    * The return value is a reference to the first node that contains the 
    * specified target. If there is no such node, the null reference is 
    * returned.  
    **/ 
    public static IntNode listSearch(IntNode head, int target) 
    { 
     IntNode cursor; 

     for (cursor = head; cursor != null; cursor = cursor.link) 
     if (target == cursor.data) 
      return cursor; 

     return null; 
    } 


    /** 
    * Modification method to remove the node after this node. 
    * @param - none 
    * @precondition 
    * This node must not be the tail node of the list. 
    * @postcondition 
    * The node after this node has been removed from the linked list. 
    * If there were further nodes after that one, they are still 
    * present on the list. 
    * @exception NullPointerException 
    * Indicates that this was the tail node of the list, so there is nothing 
    * after it to remove. 
    **/ 
    public void removeNodeAfter() 
    { 
     link = link.link; 
    }   


    /** 
    * Modification method to set the data in this node. 
    * @param newData 
    * the new data to place in this node 
    * @postcondition 
    * The data of this node has been set to newData. 
    **/ 
    public void setData(int newData) 
    { 
     data = newData; 
    }                


    /** 
    * Modification method to set the link to the next node after this node. 
    * @param newLink 
    * a reference to the node that should appear after this node in the linked 
    * list (or the null reference if there is no node after this node) 
    * @postcondition 
    * The link to the node after this node has been set to newLink. 
    * Any other node (that used to be in this link) is no longer connected to 
    * this node. 
    **/ 
    public void setLink(IntNode newLink) 
    {      
     link = newLink; 
    } 
} 

回答

0

要插入一個節點到存儲數組,首先假定你還沒有初始化你的鏈表:

storage[0] = new IntNode(head_data, head_ptr); 

如果你已經初始化你的鏈接列表,並與一些IntNode head開始,你可以將其存儲在陣列中,像這樣:

storage[0] = head; 

如果你已經進行初始化的兩個鏈接列表,你可以將它們存儲像所以:

storage[0] = head1; 
storage[1] = head2; 

IntNode[]陣列已經被初始化你上面的主要方法,這就是爲什麼你可以簡單地設置陣列的單獨的indeces。

這裏的storage數組可以像其他數組(int,chars等)一樣工作,但有一個關鍵的區別 - 如果將IntNode插入到數組中並將其更改爲數組外部,它將在數組內部更改以及。

+0

謝謝你。很好的答案。現在完美運作。 – Cadecious

+0

很高興我能幫忙:) –

相關問題