【问题标题】:Dynamic Implementation of Linked List链表的动态实现
【发布时间】:2011-12-10 11:23:07
【问题描述】:
class Nodetype
{
  int info;
  Nodetype next;

  Nodetype(int i)
  {
     info=i;
     next=null;
  }
}

我的教科书有这个代码来动态创建链接列表。 问题是,当程序逐行执行时,它将变量'info'定义为'int'类型,然后将变量'next'定义为Nodetype。

这里实际发生了什么?

这是否意味着变量'next'将包含 -

  1. 构造函数“节点类型”
  2. int 信息
  3. 节点类型“next”,其中“next”将再次包含所有 1、2、3,然后 3 将再次包含 1、2、3……等等……直到无穷大?

我真的很生气,因为我无法理解它是如何工作的,有人可以简单地解释一下吗?

【问题讨论】:

    标签: java linked-list singly-linked-list


    【解决方案1】:

    您的代码很好地遵循了列表的定义:列表是null 或一个元素后跟一个列表。
    在您的情况下,“元素”由 int 值定义,“后跟”部分是 next 变量;在 Java 变量中(当它们不是文字时,如 int 值)实际上是指针,所以虽然它们没有被初始化,但它们不存储任何有效值并且它们不指向任何内存区域(即它们的值是null),所以当 next 变量保持原样时,您的元素不会被任何其他元素跟随。要动态地将元素添加到您的列表中,您需要一个指向您添加的最后一个元素的指针,否则您将无法再次找到它们:

    int i = 0;
    Nodetype head = new Nodetype(i++);
    Nodetype last = new Nodetype(i++);
    head.next = last;
    while (i<5) {
        Nodetype temp = new Nodetype(i++);
        last.next = temp;
        last = temp;
    }
    while(head) {
        System.out.println(head.info);
        head = head.next;
    }
    

    请注意,在最后几行中,您丢失了 head 指针,并且您无法恢复列表的起点。使用列表时请记住这一点;)

    【讨论】:

      【解决方案2】:

      首先变量next 没有指向任何对象(它指向null)。有时您会使用next = new NodeType(number) 使其指向另一个节点。这个想法是你使用组合 - 你有一个类的实例,它引用了另一个实例。就像nodeA 指向nodeB,nodeB 指向nodeC。这里有三个实例,第一个实例引用第二个实例,第二个实例引用第三个实例。第三个实例是最后一个,它的下一个实例指向null。

      【讨论】:

        【解决方案3】:

        字段next 是对Nodetype 类型对象的引用。起初它不会指向任何东西——因为它被实例化为null。当您为其分配一个值时,它只会指向该值,除​​非您在列表中创建一个循环,否则任何事情都不会无限继续。

        【讨论】:

          【解决方案4】:

          您创建了类NodeType 并在类内部定义了该类的对象。这样该对象(在您的示例中为 next)将具有 int info 变量 NodeType next 对象和构造函数。

          【讨论】:

            【解决方案5】:

            它将包含 Null,因为该变量未初始化为任何值。

            【讨论】:

              【解决方案6】:

              Nodetype 是您的类,它定义节点实例将包含的数据以及对链表中下一个节点的引用。对下一个节点的引用将是 Nodetype 类型的对象。这里没什么难的,这是链表的经典实现。

              您可能想查看来自斯坦福的 great linked list resource。

              【讨论】:

                【解决方案7】:

                它的工作方式是列表由单个元素组成,每个元素只有一个指向它后面的指针:

                Nodetype next;
                

                列表中每个元素实际包含的信息如下:

                int info;
                

                您可以将列表想象成一个“链”:它实际上并不是一个单独的对象,而是多个链接的复合对象。从每个链接中,您只能看到下一个链接(或者,如果链接列表在两个方向都有引用:下一个和上一个链接),因此为了使所有元素可用,您必须保留引用到“链”中的第一个元素。

                注意:List 对象是引用“链”的第一个链接的单个对象。

                【讨论】:

                  【解决方案8】:

                  next 是对另一个 Nodetype 实例的引用。如果next == null 表示当前元素是列表中的最后一个。

                  我们来看一个例子:

                  Nodetype node = new Nodetype(0);        // i = 0, next = null
                  Nodetype anotherNode = new Nodetype(1); // i = 1, next = null
                  node.next = anotherNode;                // now the first node has a ref to the second
                  

                  【讨论】:

                    【解决方案9】:
                    #include<stdio.h>
                    #include<stdlib.h>
                    
                    void print_list(int *arr,int *size,int *capacity)
                    {
                         printf("capacity = %d; size = %d; elements = ",*capacity,*size);
                         for(int i=0;i<(*size);i++){
                            printf("%d ",arr[i]);
                        }
                         printf("\n");
                    }
                    
                    int * push_back(int *arr,int data,int *size,int *capacity)
                    {
                        int *b;
                        if(*size == *capacity){
                    
                            *capacity = 2*(*capacity);
                            b = (int *)malloc(sizeof(int)*(*capacity));
                    
                            for(int i=0;i<(*size);i++){
                            b[i]= arr[i];
                            }
                            b[*size]=data;
                            *size=*size+1;
                            print_list(b,size,capacity);
                            return b;
                        }
                    
                         arr[*size]=data;
                         *size=*size+1;
                         print_list(arr,size,capacity);
                    
                         return arr;
                    }
                    int main()
                    {
                         int size=0;
                         int n;
                         int x;
                         int *arr;
                         arr = (int *) malloc(sizeof(int));
                         int capacity=1;
                    
                         scanf("%d",&n);
                    
                         for(int i=0;i<n;i++){
                            scanf("%d",&x);
                            arr=push_back(arr,x,&size,&capacity);
                         }
                    }
                    

                    它的工作。

                    【讨论】:

                      猜你喜欢
                      • 2018-08-12
                      • 2011-11-16
                      • 2013-11-26
                      • 1970-01-01
                      • 1970-01-01
                      • 2012-11-29
                      • 1970-01-01
                      • 2020-10-01
                      • 2021-11-13
                      相关资源
                      最近更新 更多