2011-11-07 8 views
0

リンクされたリスト内の現在のノードの前に渡されたノードを挿入するメソッドで作業しようとしています。それは3つの条件があります。この実装では、先頭ノード(リストの最初のノードへの参照のみ)は存在しません。これ以上変数を追加することはできません。リンクされたリスト - 現在のノードの前にノードを挿入する

  1. リストが空の場合、渡されたノードをリストの最初のノードとして設定します。
  2. 現在のノードがリストの先頭にある場合。そうであれば、渡されたノードを現在のノードの隣に設定し、最初のノードを渡されたノードとして設定して、前方に移動させます。
  3. リストが空ではなく、現在のものが前面にない場合は、ローカルノードがリストの現在のノードと等しくなるまでリストを反復処理します。それから私は2と同じ指示をします。

ここに私のコードです。

public class LinkedList 
{ 
private Node currentNode; 
private Node firstNode; 
private int nodeCount; 

public static void main(String[] args) 
{ 
LinkedList test; 
String dataTest; 
test = new LinkedList(); 
dataTest = "abcdefghijklmnopqrstuvwxyz"; 
for(int i=0; i< dataTest.length(); i++) { test.insert(new String(new char[] { dataTest.charAt(i) })); } 
System.out.println("[1] "+ test); 

    for(int i=0; i< dataTest.length(); i++) { test.deleteCurrentNode(); } 
    System.out.println("[2] "+test); 

    for(int i=0; i< dataTest.length(); i++) 
    { 
    test.insertBeforeCurrentNode(new String(new char[] { dataTest.charAt(i) })); 
    if(i%2 == 0) { test.first(); } else { test.last(); } 
    } 

    System.out.println("[3] "+test); 
} 

public LinkedList() 
{ 
    setListPtr(null); 
    setCurrent(null); 
    nodeCount = 0; 
} 

public boolean atEnd() 
{ 
    checkCurrent(); 
    return getCurrent().getNext() == null; 
} 

public boolean isEmpty() 
{ 
    return getListPtr() == null; 
} 

public void first() 
{ 
    setCurrent(getListPtr()); 
} 

public void next() 
{ 
    checkCurrent(); 
    if (atEnd()) {throw new InvalidPositionInListException("You are at the end of the list. There is no next node. next().");} 
    setCurrent(this.currentNode.getNext()); 
} 

public void last() 
{ 
    if (isEmpty()) {throw new ListEmptyException("The list is currently empty! last()");} 

    while (!atEnd()) 
    { 
     setCurrent(getCurrent().getNext()); 
    } 

} 

public Object getData() 
{ 
    return getCurrent().getData(); 
} 

public void insertBeforeCurrentNode(Object bcNode) //beforeCurrentNode 
{ 
    Node current; 
    Node hold; 
    boolean done; 
    hold = allocateNode(); 
    hold.setData(bcNode); 
    current = getListPtr(); 
    done = false; 
    if (isEmpty()) 
    { 
     setListPtr(hold); 
     setCurrent(hold);  
    } 

    else if (getCurrent() == getListPtr()) 
    { 
     System.out.println("hi" + hold); 
     hold.setNext(getCurrent()); 
     setListPtr(hold); 
    } 

    else //if (!isEmpty() && getCurrent() != getListPtr()) 
    { 
     while (!done && current.getNext() != null) 
     { 
      System.out.println("in else if " + hold); 
      if (current.getNext() == getCurrent()) 
      { 
       //previous.setNext(hold); 
       //System.out.println("hi"+ "yo" + " " + getListPtr()); 
       hold.setNext(current.getNext()); 
       current.setNext(hold); 
       done = true; 
      } 

      //previous = current; 
      current = current.getNext(); 
     } 

    } 
    System.out.println(getCurrent()); 

} 

public void insertAfterCurrentNode(Object acNode) //afterCurrentNode 
{ 
    Node hold; 
    hold = allocateNode(); 
    hold.setData(acNode); 
    if (isEmpty()) 
    { 
     setListPtr(hold); 
     setCurrent(hold); 
     //System.out.println(hold + " hi"); 
    } 

    else 
    { 
     //System.out.println(hold + " hia"); 
     hold.setNext(getCurrent().getNext()); 
     getCurrent().setNext(hold); 
    } 
} 

public void insert(Object iNode) 
{ 
    insertAfterCurrentNode(iNode); 
} 

public Object deleteCurrentNode() 
{ 
    Object nData; 
    Node previous; 
    Node current; 
    previous = getListPtr(); 
    current = getListPtr(); 
    nData = getCurrent().getData(); 

    if (isEmpty()) {throw new ListEmptyException("The list is currently empty! last()");} 

    else if (previous == getCurrent()) 
    { 
     getListPtr().setNext(getCurrent().getNext()); 
     setCurrent(getCurrent().getNext()); 
     nodeCount = nodeCount - 1; 
    } 

    else 
    { 
     while (previous.getNext() != getCurrent()) 
     { 
      previous = current; 
      current = current.getNext(); 


     } 
    previous.setNext(getCurrent().getNext()); 
    setCurrent(getCurrent().getNext()); 
    nodeCount = nodeCount - 1; 
    } 
    return nData; 
} 

public Object deleteFirstNode(boolean toDelete) 
{ 
    if (toDelete) 
    { 
     setListPtr(null); 
    } 
    return getListPtr(); 
} 

public Object deleteFirstNode() 
{ 
    Object deleteFirst; 
    deleteFirst = deleteFirstNode(true); 
    return deleteFirst; 
} 

public int size() 
{ 
    return this.nodeCount; 
} 

public String toString() 
{ 
    String nodeString; 
    Node sNode; 
    sNode = getCurrent(); 
    //System.out.println(nodeCount); 
    nodeString = ("List contains " + nodeCount + " nodes"); 
    while (sNode != null) 
    { 
     nodeString = nodeString + " " +sNode.getData(); 
     sNode = sNode.getNext(); 
    } 
    return nodeString; 
} 

private Node allocateNode() 
{ 
    Node newNode; 
    newNode = new Node(); 
    nodeCount = nodeCount + 1; 
    return newNode; 
} 

private void deAllocateNode(Node dNode) 
{ 
    dNode.setData(null); 
} 

private Node getListPtr() 
{ 
    return this.firstNode; 
} 

private void setListPtr(Node pNode) 
{ 
    this.firstNode = pNode; 
} 

private Node getCurrent() 
{ 
    return this.currentNode; 
} 

private void setCurrent(Node cNode) 
{ 
    this.currentNode = cNode; 
} 

private void checkCurrent() 
{ 
    if (getCurrent() == null) {throw new InvalidPositionInListException("Current node is null and is set to an invalid position within the list! checkCurrent()");} 
} 

/**NODE CLASS ----------------------------------------------*/ 

    private class Node 
    { 
     private Node next; //serves as a reference to the next node 
     private Object data; 

     public Node() 
     { 
      this.next = null; 
      this.data = null; 
     } 


     public Object getData() 
     { 
      return this.data; 
     } 

     public void setData(Object obj) 
     { 
      this.data = obj; 
     } 

     public Node getNext() 
     { 
      return this.next; 
     } 

     public void setNext(Node nextNode) 
     { 
      this.next = nextNode; 
     } 

     public String toString() 
     { 
      String nodeString; 
      Node sNode; 
      sNode = getCurrent(); 
      //System.out.println(nodeCount); 
      nodeString = ("List contains " + nodeCount + " nodes"); 
      while (sNode != null) 
      { 
       nodeString = nodeString + " " +sNode.getData(); 
       sNode = sNode.getNext(); 
      } 
      return nodeString; 
     } 
    } 

} 

私は[1]と[2]の条件で動作しています。しかし、私の[3](それはinsertBeforeCurrentNode()をテストしています)が正しく動作していません。私はprintステートメントを設定しましたが、現在のどこかにリセットされていると判断しましたが、ガイダンスや解決策がどこで使えるのか分かりません。

[1]と[2]の出力が正しいです。 ZのXのV TのR P nのL個のJ HのF D BはC EがG iは、Y wが事前に任意の助けを

おかげM 0 QをS U k個:[3]

を読むべきための出力[3]リスト26個のノードを含みます。

+1

は、あなたが呼ばれるローカル変数を意味しています 'current'かフィールドは 'currentNode'と呼ばれます。それ以外は、変数をより簡単に区別できるようにすることは、一般的には良い考えです。特に、あなたの 'current'変数は' 'current''よりも前の候補です。 –

+0

私は自分の現在がリセットされていることを意味します。メソッドの最後に、私のcurrentNodeは、Zを除いてすべてのエントリを持っています。私はこの問題を見つけたら解決すると思います。 – solllodolllo

答えて

2

toStringメソッドでは、のcurrentNodeからリストの最後までノードの印刷を開始します。結果を印刷する直前にtest.last()に電話をかけるので、currentNodeはリストの最後のノードを指し、toString()は「a」だけを出力します。あなたのtoString()方法で

、あなたはあなたの26個のノードを印刷する

sNode = getListPtr(); 

sNode = getCurrent(); 

を変更することもできます。

+1

それは魅力のように働いた。私の方法はうまくいっていて、必要なのは簡単なもののための別の目です。ありがとうございました!それは有り難いです。 – solllodolllo

+0

@user - 単純なもののためにもう一組の目を必要とするのは非常に一般的です。 –

0

[3]では、現在のノードの1つ、探しているノードの1つ、現在のノードの直前のノードの2つのノードへのポインタを保持する必要があります。 。このようにして、現在の位置を探しているノードが見つかると、新しいノードを「前の」ノードと「現在の」ノードの前に接続することができます。擬似コードでは、と例[1]とする前に、[2]がカバーされていることを確認した後:あなたは、「私の現在がどこかにリセットされる」と言うとき

Node previous = null; 
Node current = first; 
while (current != null && current.getValue() != searchedValue) { 
    previous = current; 
    current = current.getNext(); 
} 
previous.setNext(newNode); 
newNode.setNext(current);