1.什么是数组模拟链表:
数组模拟链表是一个什么东东呢?就是在某索引处存储下一个索引。下面举例说明:
不知道大家明白了没有。如果我上面的数组定义为a[4],那么我访问a[0]时,所获取的就是下一个位置所对应的索引。也就是我要向访问a[0]的下一个节点,那么我只需要访问a[a[0]],这样,就获取了下一个节点处的值。
2.链表的操作:
2.1增
把0、3用frist、last进行存储的话,这样的话,在对数组进行操作以后,增加操作我个人感觉也就可以执行了(不明白的话给我回复,我可以给你解释)。此时first=0,last=3。(下面会用到)
i. 需要new一个比原数组大1的数组,然后进行数组clone。
ii. 需要修改索引为last的值为数组.length-1(此时为4)
iii. 把新增加的索引处的值改为first(此时为0)
iv. 修改last的值为数组.length-1
2.2 删
举例:删除索引为1的值所对应的元素(其实不是删除,这个我感觉很不好)。
i. 获取索引1处的值:2
ii. 获取索引2处的值:3
iii. 讲1处的值改为2处的值
iv. 如果删除的为last处的值,需要将last改为值为last处的索引,例如删除4,那么last需要改为值为4处的索引:3.
v. 如果删除的为first处的值,那么将first改为索引first处的值,例如删除0,那么first需要改为索引0处的值:1
这样,就没有了指向2处的元素,这个元素也就被“删”掉了。
2.3 其他操作
其他操作需要很强的依赖数组操作,有兴趣可以自己研究一下,由于这次我做的例子用到的不多,我也就不再一一列举了(偷个懒哈)
3.个人对该算法的看法:
i.我个人感觉这个算法也就是自己感兴趣研究研究还行,这个假删除是一个弊病。
ii.删操作中,最大的问题在于删除索引为last的数据,需要用一个for循环来找到谁的值为last
iii.这个算法我个人还有好多东西想不明白,比如交换两个数据的位置(当然这个不在链表的讨论范围内,单项回环链表中是没有这个方法的),删除操作里面那个图的顺序为0134(先不考虑回环),如果我想修改为13的位置,那么我首先需要判断1和3谁在前谁在后(此处是1在前,这个是需要判断的),然后还得再查值为1处的索引,然后修改成为3处的值,然后再把3和1处的索引相互交换。虽然没有几个操作,但是有需要查一个位置。
那么如果我要进行排序呢?算法的复杂度是不是有点高呢,因为需要查,所以增加了一阶复杂度。
下篇我将举一个例子,用来解决著名的Josephus问题。
PS:由于写这篇文章的时候,忘了把找好的资料拿上了,所以造成了有些问题不是链表所讨论的范畴,说出来只是希望大家对此算法有更加深刻的理解而已,欢迎拍砖