Java 在概念上理解此链表代码时遇到困难

Java 在概念上理解此链表代码时遇到困难,java,algorithm,linked-list,Java,Algorithm,Linked List,我很难理解为什么下面的函数delete()用于删除链接列表中的节点。我对代码的其余部分进行了删节,使其更易于阅读 因此,我知道我们有一个节点first,其中有一组节点链接到first。我还了解到,在delete()函数中,我们需要创建一个新节点n,以遍历列表。这是我的挂断: 如果我们创建一个新节点n,并设置n=first,我们已经创建了一个新节点,并且节点构造函数定义n将有一个新节点n。下一个。那么,我们不是创建了一个全新的列表,与以开头的列表分开吗?当delete()函数到达它设置n.next

我很难理解为什么下面的函数
delete()
用于删除链接列表中的节点。我对代码的其余部分进行了删节,使其更易于阅读

因此,我知道我们有一个节点
first
,其中有一组节点链接到
first
。我还了解到,在
delete()
函数中,我们需要创建一个新节点
n
,以遍历列表。这是我的挂断:

如果我们创建一个新节点
n
,并设置
n=first
,我们已经创建了一个新节点,并且节点构造函数定义
n
将有一个新节点
n。下一个
。那么,我们不是创建了一个全新的列表,与以
开头的列表分开吗?当
delete()
函数到达它设置
n.next=n.next.next
的点时,这不是在一个单独的
n
节点列表中删除一个节点吗?如何删除从
首先链接的节点?从概念上讲,这是我的障碍

我们如何实际删除列表中以
开头的节点


编辑:我想也许我回答了我自己的问题,但我希望有人能证实。这是因为
first
n
节点实际上只是引用回在
Add()
函数中创建的
新节点()?当我学会编程时,它是用C++编写的,所以我习惯于看到指针,而这个代码没有什么意义;但据我所知,Java没有明确的指针。。。那么我对这一切的看法正确吗

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

}
公共类链接列表{
静态类节点{
公共节点(){}
公共双项目;
公共节点下一步;
}
int N;
节点优先;
公共链接列表(){
第一个=空;
N=0;
公共无效删除(int k){
如果(k==0){
first=first.next;
N--;
}
否则{
节点n=第一;
对于(int i=0;i
这是因为每个链表节点仅包含对对象的引用和对下一个节点的引用。要删除节点,只需使前一个节点指向其后面的节点即可

即:初步清单:

linkedList
  ↓
node0 -> node1 -> node2 -> node3
1) 如果然后要删除
节点1
,则看起来是这样的

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。如果您有一个双链接的LinkedList,则分离和重新连接会变得更加复杂

--

我认为您误解了“delete”的作用。在Java中,用户不手动管理内存,因此您不调用
malloc
delete
destroy
等。您只需删除对对象的所有引用,它们最终会被JVM收集到垃圾


在上面的代码中,我们只讨论“删除”从数据结构的角度来看,链接列表中的
节点

这是因为每个链接列表节点只包含对对象的引用和对下一个节点的引用。要删除节点,只需将前一个节点指向后一个节点即可

即:初步清单:

linkedList
  ↓
node0 -> node1 -> node2 -> node3
1) 如果然后要删除
节点1
,则看起来是这样的

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。如果您有一个双链接的LinkedList,则分离和重新连接会变得更加复杂

--

我认为您对“delete”的作用有误解。在Java中,用户不会手动管理内存,所以您不会调用
malloc