开卷有益,最近正按计划巩固自己算法与数据结构的基础知识,目前看来收获开始很多的,重拾了很多遗忘的知识,注意到很多以前没有留意的细节。在复习使用链表实现栈是,注意到了一句话:“链表结构的细节内容应该与链表所存储的元素区分开来”。

 

  我试着去理解这句话中包含的东西,以前我使用的链表大概是这样的:

 

 

   DATA是我们要存储的数据,如果我们想要用DATA实现链表结构,我们需要在DATA中添加一个存储DATA对象地址的变量next。之前我并没有意识到也没有去思考过这种使用方式会有什么缺陷,今天思考了一下,确实发现了这种使用方式的一些缺陷:

  1、为了使用链表存储DATA对象,DATA被迫存储了与自己无关的next变量。

  2、DATA必须明确的知道,自己会成为DATA对象链表中的一个元素。

  3、链表存储的数据和链表的结构耦合度过高,违背了集合实现细节与集合使用相分离的目标。

  解决以上问题的方案是,定义一个独立的节点类,节点类中仅包含两个成员属性,一个为指向下一节点的next,一个为指向本节点存储数据的data。next和data可以是指针,也可以是引用。

 

  在java中,在可以设置data的类型为Object,因为Object是所有类的父类,利用向上转型,data可以指向任何类的对象,即我们定义的链表能够存储所有类型的数据。