从单向链表结构看空间复杂度换时间复杂度

最近在复习数据结构,在手写单向链表结构的时候,清晰的感觉到一个合理的数据结构在使用起来,真的事半功倍。下面就我自己的感受说说我对内存空间换取降低操作数据时的时间复杂度的一点浅见。
首先单向链表的结构可以简单的表示为:

头结点是节点1的引用,而节点1的next属性又是节点2的应用,以此类推,最后一个节点的next属性则指向一个空对象。
在手写该链表的append(data)方法时,我首先需要根据data创建一个新节点newNode(属性next默认为null),data就是上图所示的item,然后我需要找到链表的最后一个节点,将该节点的next属性指向该节点,即最后一个节点的next属性是新节点的引用,为了找到最后一个节点,我可以遍历链表,只要找到属性next为空的节点就可以了,这样,添加一个子节点的时间复杂度是O(N),而如果我在链表结构中声明一个lastNode属性,该属性始终指向该链表中的最后一个节点,那么在添加节点的时候,我就可以省掉查找最后一个子节点这个步骤,直接获取this.lastNode进行操作就可以了,这样添加一个子节点的时间复杂度为O(1),而代价就是内存中多了个变量lastNode。
如果上面的例子还不能让你感受到空间换时间的妙处,那链表中的size()方法应该可以给你更强烈的感觉。size()方法用来获取单向链表中节点的个数,如果通过遍历每个节点,来获取节点的个数,那每次调用size()方法的时间复杂度为O(N),并且在实际运用中,我们经常是需要知道链表子节点的个数的,因此使用此实践不太妥当,如果在链表结构中声明了length属性,该属性表示节点的个数(也可以表示链表的长度),在增加节点是让length加1,删除节点是length减1,那么在size()方法中,我们只需获取length的值,然后返回就可以了,这样实现size()方法的时间复杂度就为O(1),而代价也仅仅是内存中多了个length变量。
以上是我自己在复习数据结构时的一些想法,如有错误,欢迎指正!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值