1)我可以在C中创建一个不使用指针(不使用结构)的链接列表吗?
2) Java不使用指针,那么链表是如何在Java中实现的呢?
- 我不知道这怎么可能
- Java确实有指针。它们在Java中只是被称为引用,但它们基本上是一样的。每个指向对象的变量都是指向该对象的引用或指针。如果变量为null,并且您试图取消引用它,则会得到一个NullPointerException
如果您可以忍受一些愚蠢的限制,例如列表的最大长度是固定的,并且预先分配所有潜在元素,那么您可以使用索引来替换指针。
这可以使元素本身变小,因为如果你知道元素数量的良好边界(为了预分配工作,你必须这样做),你可以调整索引的大小,但你不能用指针这样做。对于最多包含1000个元素的列表,可以使用uint16_t
索引,它是64位体系结构上指针大小的1/4。
另一方面,索引涉及到地址计算,而在只遵循直接指针时不需要这些计算,因此可能会带来性能成本。
至于1,我认为这是不可能的。
对于2,您应该查看这个优秀的资源http://cslibrary.stanford.edu/
对于java,它是LinkedList正在使用的引用http://docs.oracle.com/javase/6/docs/api/java/util/LinkedList.html
1-否。链表的意义在于它是动态数据结构。这意味着您可以在运行时更改它的大小(而不是在编译程序时必须知道它的大小)。这只能用指针来完成,因为当你分配一些新内存时,你需要知道如何找到它
你可以在没有结构的情况下完成,但它们是最合适的结构。
2-Java有对对象的引用。它们基本上与指针相同,只是你不能用它们进行算术运算,而且它们是类型安全的。
1-当然。使用一组并行数组(每个属性一个),并使用数组索引作为指针。一代又一代的FORTRAN程序员(以及像我这样从FORTRAN编程中学习的大学生)将这种方法用于各种数据结构——列表、树、堆栈、队列等。这很丑陋,是一种巨大的痛苦,它有一些真正的局限性,但它肯定是可能的。指针类型和聚合类型使数据结构的实现变得更容易,但它们几乎不是必需的。
2-Java在所有地方都使用指针;它只是不向程序员公开指针类型上的操作。任何时候使用引用类型(基本上,任何需要使用new
创建实例的类型),都是在使用指针。
1)由于所有内存分配都以某种方式涉及指针,并且您需要为列表中的新条目分配额外的内存,因此不可能使用随着元素数量而增长和收缩的传统链表。
2) Java有引用,它们与指针相同,只是不能对它们进行指针运算(如int* p = q + 1;
)。
- C中没有指针或
struct
s的链表?好大概您可以有一组数组,一个包含数据,另一个包含下一个节点的索引。当然,数组使用指针 - Java使用的引用几乎是指针,但并不完全是指针
1)如果你绝对必须这样做,那么建议"愚蠢的限制"的答案可能是你最好的选择,尽管其中一些限制迫使你放弃使用链表的意义。例如,容易调整大小变为不可能调整大小。你为什么不想使用指针?
2) 你没有看到他们并不意味着他们不在那里。更准确的说法是"我不必在Java中处理指针或它们的算术。"如果你需要向自己证明指针是隐藏的,请使用int和Integer 执行以下过程
0)(我们是优秀的代码主管)声明并初始化变量为31) 打印出来2) 将其传递给另一个函数3) 在该函数中递增4) 重新打印5) 返回6) 从调用函数打印。
使用int类型将打印3 4 3,使用Integer将打印3,4,4。这是因为对象是通过引用传递的,这意味着你仍然在幕后处理指针。参考文献是不同的,因为(在大多数情况下)你不必处理它们。