我目前正在尝试创建一个使用尾递归的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);
}
}
答案 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方法被认为是一种好习惯。方法名称应以小写字母开头。