2016-12-10 20 views
0

現在、二重リンクリストを学習中です。アイテムを削除 - テール再帰を使用した二重リンクリスト

私はほぼ100%機能していた二重リンクリストを書き直すことができました。しかし、私は末尾再帰でそれを書く方法を学ぶ必要があります。私は末尾再帰を使用して作業私のAddItemメソッドを取得するために管理していると私は今働いて削除項目を取得するに探してい

public class DLLNode 
{ 
    private DLLNode previous; 
    public DLLNode next; 
    private String value; 

    public DLLNode(String value) 
    { 
     this.value = value; 
     this.previous = previous; 
     this.next = next; 
    } 

    public DLLNode(String value, DLLNode next, DLLNode previous) 
    { 
     this.value = value; 
     this.next = next; 
     this.previous = previous; 
    } 

    public String GetDataItem() 
    { 
     return value; 
    } 

    public void setDataItem() 
    { 
     this.value = value; 
    } 


    public DLLNode GetPreviousNode() 
    { 
     return previous; 
    } 

    public void setPrevious(DLLNode previous) 
    { 
     this.previous = previous; 
    } 


    public DLLNode GetNextNode() 
    { 
     return next; 
    } 

    public void setNextNode(DLLNode next) 
    { 
     this.next = next; 
    } 

    public void addItem(String value) { 
     if(this.next == null) { 
      // Stopping condition 
      DLLNode newNode = new DLLNode(value); 
      this.next = newNode; 
     } else { 
      // Recurse 
      this.next.addItem(value); 
     } 
    } 

} 

以下は私のDLLNodeコードです。私はaddItemのように私のDLLNodeにdeleteItemを追加する必要があると思います。

以下

私DoublyLinkedListクラスです:私はこのコードを変換して始めることができる場所に

public class DoublyLinkedList 
{ 
    private int noOfItems; 
    private DLLNode head; 
    private DLLNode tail; 

    // Default constructor 
    public DoublyLinkedList() 
    { 
     head = null; 
     tail = null; 
     this.noOfItems = 0; 
    } 



    public void DeleteItem(int index) 
    { 
     if (index ==0) 
     { 
      System.out.println("Out of Bounds"); 
     } 
     if (index > noOfItems) 
     { 
      System.out.println("Out of Bounds"); 
     } 
     if (head == null) 
     { 
      System.out.println("No Item to remove"); 
     } 
     else if (index == 1) 
     { 
      head = head.GetNextNode(); 
      noOfItems--; 
     } 
     else 
     { 
      int position = 0; 
      DLLNode currentNode = head; 

      while (currentNode != null) { 
       if (position == index-1) { 
        currentNode.setNextNode(
          currentNode.GetNextNode().GetNextNode()); 
        noOfItems--; 
        break; 
       } 
       currentNode = currentNode.GetNextNode(); 
       position++; 
      } 
     } 
    } 
} 

任意のヒントをいただければ幸いです。

親切、 ベン。

P.S.コードが書式設定された方法に対する謝罪 - 私はそれを修正しようとしましたが、ソートされていないようです。誰でもコードを書式設定するのにいいですか?さらにテストなし

答えて

0
private void DeleteItemHelper(final int indexToDelete, int curIndex, DLLNode curNode) { 
    if (curIndex == indexToDelete) { 
     // Handle removing a node with both a previous and next nodes. 
    } 

    else { 
     DeleteItemHelper(indexToDelete, curIndex + 1, curNode.getNextNode()); 
    } 
} 


public void DeleteItem(int index) { 
    DeleteItemHelper(index, 0, head); 
} 
+0

こんにちはYnon、私はに行くヘルパーを推測している私DLLNodeクラス?あるいは、彼らは両方ともdoublylinkedlistクラスに入っていますか? – benjano

+0

DoublyLinkedListクラス内にある必要があります。 – Ynon

+0

私はリストが循環的であると仮定していることに注意してください。つまり、頭が最後のノードを指し、その逆もまた同様です。 – Ynon

0

私はあなたが削除したノード以下のノードのヘッド基準を再設定し忘れていることを考える:

if (position == index-1) { 
    // Tail of currentNode is set to the node following 
    // next node, but head of that node still points to the 
    // node which should be removed from list 
    currentNode.setNextNode(
     currentNode.GetNextNode().GetNextNode()); 
    noOfItems--; 
    break; 
} 
関連する問題