Linked list 链表在内存中是一种非常有用的数据存储方式, 例如如果你比较土豪,有一个1000平米的大房子,则你住进去1000平米的空间都是你的,你想睡那张床都是可以的,甚至可以叫上你的那些F们一起睡大通铺。
但实际上,这样的土豪不常见,常见的还是一个人有几套房子的土豪,二环,三环,四环,五环,六环都有一套房子,但是都是70 -80的房子,所以你就需要开上你的车,拿好你的地址,一晚上可以从深夜到早晨,一直从二环睡到六环。当然比起1000平米的房子,这样是有点耗费精力,但是至少你也是睡过多张床的任性小天使。
这就好比内存,想分配一段空间给你的程序,但实际上他们的都不连续,所以
你就豪横的将这些房子都买下,并标记好今晚要住宿的这些房子的地址,然后一个一个睡下去。
这样的好处也是显而易见的,如果你资不抵债,1000平米的房子你想短时间卖出去,那是很困难的,但如果你想卖掉6环的房子,加钱弄套四合院,还不是那么骨感。卖掉六环的房子,将你的四合院加入到你的每天要睡的地址名单就好了,这就是链表的灵活性。不会限制的那么死,也便于内存空间的释放和申请。
所以优点和缺点共存。
1 在内存不足或占用率高的情况下,也能申请足够的内存
2 提高内存的使用率和灵活度
缺点:
1 提高访问数据的成本
2 访问的速度会降低
通过两个列表来进行相关的链表的遍历模拟
1 listv 为具体的链表的值的存储
2 listp 为链表中的值所存储的逻辑位置的表示
3 listp中的-1为表示链表的终止的位置
4 当达到-1 时,由于while循环停止,所以后一个元素将无法被遍历
5 通过 while else 将后一个元素打印出来
但这样的程序是有漏洞的
1 如果两个list的值的一一对应中数量不一致,会导致程序报错
2 如果listp中没有终止位,则整体程序会进入死循环
所以要避免这两个漏洞,需要在进行运算前,对两个list进行判断,并且还需要对 listp中是否有 -1 终止位进行判断。
从数据访问的角度,链表的还可以进行双向的方式的访问,通过两个方向来访问到数据
从这几次的文字,从次的重组排序(数组)到本次(第三次)链表,在内存中,为什么链表这样的数据结构使用的比数组要多。我们需要对比数组和链表之间在内存中的区别,这还的从,随机访问和顺序访问来说
1 链表只能顺序访问,数组可以随机访问
2 在内存中如果使用数组方式,需要申请连续的内存,所以使用数组方式申请的内存需要提前申请并大概率是要浪费空间的,并且在内存不足的情况下,需要将申请更大的内存,并且在将现有内存的内容迁移到新的申请空间中。
3 链表在内存申请中是比较灵活的,不需要提前申请,并且内存的释放回收都比较方便,链表的对于数据的插入和清理是有利的。