【问题标题】: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'将包含 -
- 构造函数“节点类型”
- int 信息
- 节点类型“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 对象和构造函数。
【解决方案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);
}
}
它的工作。