自己实现集合框架(八):可排序单链表的实现
一. 什么叫可排序的单链表?
场景描述:
在项目中我们常常会有这样的需求,在存放元素的时候可以预先按照数值大小进行排序(升序或降序),那么在取出数据的时候就不需要再次排序了。
什么叫可排序的单链表?
可排序的单链表指单链表各结点的数据域data
的值按照递增(由小到大)或者递减(由大到小)的方式链接起来。
如何实现可排序的单链表?
我们都知道java
里面的TreeSet
集合是可排序的,并且支持自然排序和定制排序两种方式。那么可排序的单链表是如何做到可排序的呢?
一个对象要能够进行排序比较大小,它必须要实现java.lang.Comparable
接口,并实现该接口的compareTo()
方法,该方法返回一个整数值,当一个对象调用该方法与另外一个对象进行比较时,例如obj1.compareTo(obj2)
,如果该方法返回0
,则表明这两个对象相等;如果该方法返回一个正整数,则表明obj1
大于obj2
;如果该方法返回一个负整数,则表明obj1
小于obj2
。那么单链表要实现可排序,则结点data
域的对象必须是可比较大小的,即已经实现了java.lang.Comparable
接口的compareTo()
方法。
二. 可排序单链表的实现
1.定义可排序单链表
可排序单链表类SortedHeadSinglyLinkedList
声明如下,它继承带头结点的单链表类HeadSinglyLinkedList
,二者相同的方法不再介绍,请参见之前的文章自己实现集合框架(七):带头结点单链表的实现,只是在插入元素和移除元素的时候会有不一样,也就是需要比较大小,代码如下所示:
2. 可排序单链表的插入
代码解释:
1. 插入的元素对象不能为空,并且需要实现
Comparable
接口。
2. 插入规则是,从空链表开始,逐个插入结点建立排序的单链表,每插入一个结点,首先要从单链表的第0
个节点开始,将待插入元素elment
依次与当前结点的data
值比较大小,以确定插入位置并进行插入操作。
3. 可排序单链表的移除
代码解释:
可排序单链表的删除,在实际的操作逻辑上和可排序的单链表的插入比较类似,都是需要比较大小,然后移动数据元素。
三.测试
测试代码如下所示:
运行效果如下图所示: