- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我目前正在尝试创建一个使用尾递归的双向链表。
我的 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/
目前正在用 MFC 编写一个基于对话框的应用程序,当按下主对话框上的按钮时创建一个子对话框。子对话框然后有 3 个编辑控件框和一个按钮。当按下按钮时,来自三个编辑控制框的信息被检索并存储为单独的 CS
我目前正在尝试创建一个使用尾递归的双向链表。 我的 addItem 已完全正常工作。我的 InsertItem 在指定索引处成功插入和项目。但是它会删除那里的任何项目并且不会移动所有数据。当尝试在索引
所以,我有一个 UICollectionView,我可以在其中插入新项目。 我使用了 Collection View Programming Guide 中的大部分建议- “让插入和删除动画更有趣”部
我有一个相当简单的 PyQt 问题。 (Python 3.4、PyQt 4.11.3、Qt 4.8.5)我使用 Qt Designer (Ui_Dialog) 构建了一个非常简单的对话框。该对象有一个
我有一个包含 10000 条记录的 CListCtrl,当程序启动时它会被填满,这个操作的时间约为 1.3 秒。但如果用户刷新列表,它会在 ~2.5 - 3 秒内填满。 在这两种情况下工作的是同一段代
非常感谢您抽出时间!我一直在使用 Collection View ,并且完全被我的代码的一小部分所困扰,它的行为不符合我的预期。这是两行(我认为是唯一相关的): diceCollectionView.
我在 wordpress 主题中使用响应式 CarouFredSel slider 。我在窗口宽度更改时删除并放回 slider 元素(第一个 slider 元素,即菜单):如果宽度小于 980 像素
我有一个数组,其中包含我的 UICollectionView 显示的一些元素。然后我去获取更多元素并将其附加到我的数组中。然后我想告诉 UICollectionView 元素已添加到数据源并更新 UI
基本上第一次运行它是完美的然后第二次它崩溃了。我有一些图片显示它在哪一行代码上崩溃。该问题似乎与执行批处理有关。 代码: let ref = Database.database().referen
我正在开发带有全屏单元格的水平 UICollectionView。 单元格内部有 WKWebview,它加载下一个单元格的 url。 加载下一个网址时,将插入新单元格。 extension ViewC
后续来自: Adding HTML to JQuery Isotope additems/insertitems 我有布雷迪的: function makeDataSlide(slideId, img
我是一名优秀的程序员,十分优秀!