- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我无法理解为什么下面的函数 delete()
用于删除链表中的节点。我删减了其余代码,使它们更易于阅读。
所以,我知道我们有一个节点 first
,其中有一堆节点链接到 first
。我也了解到,在delete()
函数中,我们需要新建一个节点n
来遍历链表。这是我的挂断电话:
如果我们创建一个新节点n
,并设置n = first
,我们就创建了一个新节点,节点构造函数定义了n
也将有一个新节点 n.next
。那么,我们不是已经创建了一个全新的列表,与以 first
开头的列表分开吗?当 delete()
函数到达它设置 n.next = n.next.next
的位置时,这不是删除整个单独列表中的节点吗? n
个节点?这如何删除与 first
链接的节点?从概念上讲,这是我的挂断。
我们实际上如何删除列表中以 first
开头的节点?
编辑:我想也许我回答了我自己的问题,但我希望有人可以验证。这是否有效,因为 first
和 n
节点实际上只是对在 Add 中创建的
函数?当我学习编程时,它是用 C++ 编写的,所以我习惯于看到指针,这段代码没有多大意义;但据我了解,Java 没有明确的指针……所以我对所有这些都是正确的吗?New Node()
对象的引用()
public class LinkedList {
static class Node {
public Node() { }
public double item;
public Node next;
}
int N;
Node first;
public LinkedList () {
first = null;
N = 0;
public void delete (int k) {
if (k == 0) {
first = first.next;
N--;
}
else {
Node n = first;
for (int i = 0; i < k-1; i++) {
n = n.next;
}
n.next = n.next.next;
N--;
}
}
public void add (double item) {
Node newfirst = new Node ();
newfirst.item = item;
newfirst.next = first;
first = newfirst;
N++;
}
private static void testDelete () {
MyLinked b = new MyLinked ();
b.add (1);
print ("singleton", b);
b.delete (0);
print ("deleted", b);
for (double i = 1; i < 13; i++) {
b.add (i);
}
print ("bigger list", b);
b.delete (0);
print ("deleted at beginning", b);
b.delete (10);
print ("deleted at end", b);
b.delete (4);
print ("deleted in middle", b);
}
public static void main (String args[]) {
testDelete();
}
}
最佳答案
这是因为每个链表节点只包含对您的对象的引用和对下一个节点的引用。要删除一个节点,您只需让前一个节点指向它后面的节点即可。
即。初始列表:
linkedList
↓
node0 -> node1 -> node2 -> node3
1) 如果您随后要删除 node1
,则它看起来像这样
linkedList
↓
node0 ----------> node2 -> node3
node1 ----↑
node0
将不再指向 node1
,因此如果您尝试从 node0
迭代,您将转到 node2
下一步。但是,node1
仍会“指向”node2
(当然,直到它被垃圾收集为止)。
2) 如果您改为删除 node0
,它看起来像这样:
linkedList
↓
node0 -> node1 -> node2 -> node3
您只需将 LinkedList
的 first
字段移动到指向 node1
等,如果您要执行 linkedList。首先
您将访问node1
。 node0
然而最终会被垃圾收集,因为没有任何东西引用它(除非你在其他地方这样做)。
请记住,这些情况适用于单链接链表。如果您有一个双向链接的 LinkedList,那么分离和重新附加会变得有点复杂。
--
我认为您对“删除”的作用有误解。在 Java 中,用户不会手动管理内存,所以你不会调用 malloc
或 delete
、destroy
等,你只需删除所有对对象的引用,它们最终将被 JVM 收集为垃圾。
在上面的代码中,我们只是从数据结构的角度来讨论从LinkedList
中“删除”一个Node
。
关于java - 在概念上理解这个链表代码有困难,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48510663/
我正在编写一个具有以下签名的 Java 方法。 void Logger(Method method, Object[] args); 如果一个方法(例如 ABC() )调用此方法 Logger,它应该
我是 Java 新手。 我的问题是我的 Java 程序找不到我试图用作的图像文件一个 JButton。 (目前这段代码什么也没做,因为我只是得到了想要的外观第一的)。这是我的主课 代码: packag
好的,今天我在接受采访,我已经编写 Java 代码多年了。采访中说“Java 垃圾收集是一个棘手的问题,我有几个 friend 一直在努力弄清楚。你在这方面做得怎么样?”。她是想骗我吗?还是我的一生都
我的 friend 给了我一个谜语让我解开。它是这样的: There are 100 people. Each one of them, in his turn, does the following
如果我将使用 Java 5 代码的应用程序编译成字节码,生成的 .class 文件是否能够在 Java 1.4 下运行? 如果后者可以工作并且我正在尝试在我的 Java 1.4 应用程序中使用 Jav
有关于why Java doesn't support unsigned types的问题以及一些关于处理无符号类型的问题。我做了一些搜索,似乎 Scala 也不支持无符号数据类型。限制是Java和S
我只是想知道在一个 java 版本中生成的字节码是否可以在其他 java 版本上运行 最佳答案 通常,字节码无需修改即可在 较新 版本的 Java 上运行。它不会在旧版本上运行,除非您使用特殊参数 (
我有一个关于在命令提示符下执行 java 程序的基本问题。 在某些机器上我们需要指定 -cp 。 (类路径)同时执行java程序 (test为java文件名与.class文件存在于同一目录下) jav
我已经阅读 StackOverflow 有一段时间了,现在我才鼓起勇气提出问题。我今年 20 岁,目前在我的家乡(罗马尼亚克卢日-纳波卡)就读 IT 大学。足以介绍:D。 基本上,我有一家提供簿记应用
我有 public JSONObject parseXML(String xml) { JSONObject jsonObject = XML.toJSONObject(xml); r
我已经在 Java 中实现了带有动态类型的简单解释语言。不幸的是我遇到了以下问题。测试时如下代码: def main() { def ks = Map[[1, 2]].keySet()
一直提示输入 1 到 10 的数字 - 结果应将 st、rd、th 和 nd 添加到数字中。编写一个程序,提示用户输入 1 到 10 之间的任意整数,然后以序数形式显示该整数并附加后缀。 public
我有这个 DownloadFile.java 并按预期下载该文件: import java.io.*; import java.net.URL; public class DownloadFile {
我想在 GUI 上添加延迟。我放置了 2 个 for 循环,然后重新绘制了一个标签,但这 2 个 for 循环一个接一个地执行,并且标签被重新绘制到最后一个。 我能做什么? for(int i=0;
我正在对对象 Student 的列表项进行一些测试,但是我更喜欢在 java 类对象中创建硬编码列表,然后从那里提取数据,而不是连接到数据库并在结果集中选择记录。然而,自从我这样做以来已经很长时间了,
我知道对象创建分为三个部分: 声明 实例化 初始化 classA{} classB extends classA{} classA obj = new classB(1,1); 实例化 它必须使用
我有兴趣使用 GPRS 构建车辆跟踪系统。但是,我有一些问题要问以前做过此操作的人: GPRS 是最好的技术吗?人们意识到任何问题吗? 我计划使用 Java/Java EE - 有更好的技术吗? 如果
我可以通过递归方法反转数组,例如:数组={1,2,3,4,5} 数组结果={5,4,3,2,1}但我的结果是相同的数组,我不知道为什么,请帮助我。 public class Recursion { p
有这样的标准方式吗? 包括 Java源代码-测试代码- Ant 或 Maven联合单元持续集成(可能是巡航控制)ClearCase 版本控制工具部署到应用服务器 最后我希望有一个自动构建和集成环境。
我什至不知道这是否可能,我非常怀疑它是否可能,但如果可以,您能告诉我怎么做吗?我只是想知道如何从打印机打印一些文本。 有什么想法吗? 最佳答案 这里有更简单的事情。 import javax.swin
我是一名优秀的程序员,十分优秀!