繁体   English   中英

从概念上理解此链接列表代码时遇到麻烦

[英]Having trouble conceptually understanding this Linked List code

我在理解为什么下面的delete()函数可用于删除链表中的节点时有些麻烦。 我删节了其余代码,以使所有内容都易于阅读。

因此,我了解我们first拥有一个节点,并且有许多节点链接到first 我也了解在delete()函数中,我们需要创建一个新节点n来遍历列表。 这是我的挂断电话:

如果我们创建一个新节点n并设置n = first ,那么我们创建了一个新节点,并且节点构造函数定义n也将有一个新节点n.next 因此,我们是否创建了一个与first开头的列表分开的全新列表? delete()函数达到设置n.next = n.next.next ,难道不是要删除一个单独的n节点列表中的一个节点吗? 这如何删除first链接的节点? 从概念上讲,这是我的挂断电话。

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

编辑:我想也许我回答了我自己的问题,但我希望有人可以验证。 这是否可行,因为第first和第n节点实际上只是对Add()函数中创建的New Node()对象的引用? 当我学习编程时,它是使用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();
    }

}

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

即。 初始清单:

linkedList
  ↓
node0 -> node1 -> node2 -> node3

1)如果要删除node1 ,则它看起来像这样

linkedList
  ↓
node0 ----------> node2 -> node3
         node1 ----↑

node0将不再指向node1 ,因此,如果您尝试从node0进行迭代,则node0将转到node2 但是, node1仍将“指向” node2 (当然,直到收集到垃圾为止)。

2)如果您删除了node0 ,则它看起来像这样:

       linkedList
           ↓
node0 -> node1 -> node2 -> node3

您只需将LinkedListfirst字段移至指向node1 ,因此,如果要执行linkedList.first ,则将访问node1 但是, node0最终将被垃圾回收,因为没有东西引用它(除非您在其他地方这样做)。

请记住,这些情况对于单链接的LinkedList都是正确的。 如果您有一个双向链接的LinkedList,则分离和重新附加会变得更加复杂。

-

我认为您对“删除”的功能有误解。 在Java中,用户不会手动管理内存,因此您不会调用mallocdeletedestroy等。您只需删除对对象的所有引用,它们最终将被JVM收集。

在上面的代码中,我们只是在谈论根据数据结构从LinkedList中“删除”一个Node

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM