gpt4 book ai didi

java - 使用尾递归的 DoublyLinkedList - InsertItem

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:15:53 26 4
gpt4 key购买 nike

我目前正在尝试创建一个使用尾递归的双向链表。

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

这是我的节点类:

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);
}


}

最佳答案

想想这里发生了什么:

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 -> C

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

A ->C

newNode.setNextNode(currNode.GetNextNode());

新节点 -> C

currNode.setNextNode(newNode);

A -> 新节点 -> C

newNode.setPrevious(currNode);

设置从 newNode 到 A 的反向链接


你可能想做什么

newNode.setNextNode(currNode.getNextNode());

新节点 -> B

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

currNode.setNextNode(newNode);

A -> 新节点

所以现在你应该有类似 A -> newNode -> B 的东西了。不需要碰 C。

现在您可以修复反向链接,您就大功告成了。

currNode.getNextNode().setPrevious(newNode);

设置从 B 到新节点的反向链接

newNode.setPrevious(currNode);

设置从 newNode 到 currNode 的反向链接

p.s.:我没有测试这个。我没有查看 if 条件本身,我没有考虑您的 indexToInsert ==1-case 等。我仍然希望让您了解错误的出处从并为您指明正确的方向...

p.p.s.:坚持 standard java naming conventions 被认为是好的做法- 方法名称应以小写字母开头。

关于java - 使用尾递归的 DoublyLinkedList - InsertItem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41124469/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com