使用尾递归的DoublyLinkedList - InsertItem

时间:2016-12-13 15:13:13

标签: java algorithm linked-list doubly-linked-list

我目前正在尝试创建一个使用尾递归的DoublyLinked列表。

我的addItem完全正常工作。我的InsertItem在指定的索引处成功插入和item。然而,它删除了那里的任何项目,并没有移动所有数据。当我尝试在索引1处添加时,我的代码也会崩溃。我已经注释掉了我试图使其工作的代码。

这是我的Node类:

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) {
          DLLNode newNode = new DLLNode(value);
          this.next = newNode;
     } else {
          this.next.addItem(value);
     }
}


  public void InsertItemHelper(String value, int indexToInsert, int current, DLLNode currNode)
  {
      /*if (indexToInsert == 1)
      {
          DLLNode newNode = new DLLNode(value);
          currNode.setNextNode(newNode);
      }*/
      if (current == indexToInsert-2)
      {
          DLLNode newNode = new DLLNode(value); 
          currNode.setNextNode(currNode.GetNextNode().GetNextNode());
          newNode.setNextNode(currNode.GetNextNode());
          currNode.setNextNode(newNode);
          newNode.setPrevious(currNode);   
      }
      else
      {
          InsertItemHelper(value, indexToInsert, current+1, currNode.GetNextNode());
      }
  }

    public void DeleteItemHelper(int indexToDelete, int current, DLLNode currNode)
  {
      if (current == indexToDelete-2)
      {
          currNode.setNextNode(currNode.GetNextNode().GetNextNode());
      }
      else
      {
          DeleteItemHelper(indexToDelete, current+1, currNode.GetNextNode());
      }
  }



}

这是我的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 int GetNoOfItems()
  {
    return noOfItems;
  }

  /* Returns the String value held at index (base zero) or null if the index
   * is out of bounds */
  public String GetItemByIndex(int index)
  {
    return null;
  }


  public DLLNode GetNodeByIndex(int index)
  {
    return null;
  }


  public void AddItem(String value)
  {
      if (head == null)
      {
          DLLNode newNode = new DLLNode(value);
          head = newNode;
          noOfItems++;
      }
      else
      {
      head.addItem(value);
      noOfItems++;
      }
       }



  public void InsertItem(int index, String value)
  {
      if (index > noOfItems)
      {
          AddItem(value);
      }
      else {
        head.InsertItemHelper(value, index, 0, head); 
        noOfItems++;
      }


  }


  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
          {
              head.DeleteItemHelper(index, 0, head);
              noOfItems--;
          }

  }

  public int getNoOfItems()
  {
      return this.noOfItems;
  }

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


}

1 个答案:

答案 0 :(得分:1)

想想这里发生了什么:

currNode.setNextNode(currNode.GetNextNode().GetNextNode());
newNode.setNextNode(currNode.GetNextNode());
currNode.setNextNode(newNode);
newNode.setPrevious(currNode);

分析您的代码段

A:= currnode; B:=currnode.getNextNode(); C:=currnode.getNextNode();

所以我们有类似A - > B - > ç

currNode.setNextNode(currNode.GetNextNode().GetNextNode());

A - > C

newNode.setNextNode(currNode.GetNextNode());

newNode - > ç

currNode.setNextNode(newNode);

A - > newNode - > ç

newNode.setPrevious(currNode);

设置从newNode到A

的反向链接

你可能想做什么

newNode.setNextNode(currNode.getNextNode());

newNode - >乙

现在我们可以将currNode的链接更改为newNode

currNode.setNextNode(newNode);

A - > newNode

所以现在你应该有像A - >这样的东西。 newNode - > B.无需接触C.

所以现在你可以修复反向链接了,你已经完成了。

currNode.getNextNode().setPrevious(newNode);

设置从B到newNode的反向链接

newNode.setPrevious(currNode);

设置从newNode到currNode的反向链接

p.s:我没有测试过这个。我没有调查if条件本身,我没有考虑你的indexToInsert ==1 - 案件等等。我仍然希望能让你知道错误来自哪里并指出你正确的方向...

p.p.s。:坚持使用standard java naming conventions方法被认为是一种好习惯。方法名称应以小写字母开头。