初衷💁🏻
由于工作量加大,加之每天要写博客的内容上,深度可能没有那么深度了,但是为了保持这个日更的习惯,还是要坚持更新一些,我也发现了,其实写这个博文,更让我从某种程度上我重新的安静下来,重新的去理解和审视之前学习过的知识,之前的薄弱点在哪里,即使在工作量非常大的情况下,我觉得还是有必要回顾一下以前学过的数据结构的知识点的,我有点不太想把这个集成到工作的日常内容的分享,现在想不想不知道要不要将这个将工作的日常内容也记录到这里面,这样就面对是否要变成日报或者周报的汇总了,后面再考虑下。
数据结构
今天重新回顾了下链表相关的数据结构也就是LinkedList,先不上代码了,简单了解下我对链表的理解,链表的出现也是为了解决ArrayList的空间浪费的问题,虽然ArrayList的问题解决了数组不能主动扩容的问题,但是还是会造成空间的浪费,其实后面再实际工作中发现了,真实的情况下,很少有用到LinkedList,没有会在意那些个多余的空间,但是关于LinkedList的数据结构的设计是非常巧妙的,在设计的时候,需要根据对应的prev和后置的next的节点来进行重新的指针指向。
谈一下我对这个LinkedList的看法,之前在整个学校链表的过程中,尤其在学习到双向循环链表的时候,非常的绕,一会next,一会prev,工作中完全没有用到过这种东西,但是不可否认的,这么复杂的逻辑情况下,如果自己可以抽象的很清楚的话,那么还有什么复杂的业务是不能用程序来进行实现的呢,所以在学习链表的这个地方,我觉得还是慢下来,仔细思考下为什么这么设计,之前在学习链表的过程中,可以明显的看到,在学习链表的时候,需要进行Node<E>这个内部类的设计,其实我之前一直不明白,你用链表为啥非要搞内部类,为啥一定要有Node<E>这种操作,而没有想ArrayList这种直接简单的操作,不需要用对象操作,其实这个链表也有点面向对象的那种意思了。但是今天重新回顾了一下,用面向对象,这种Node<E>就两个属性,记录当前的内容,和下一个对象的地址,这不就是为了节省空间才这么设计的么,ArrayList里面如果存放了对象,记录的也是地址,然后通过地址在去指向实际的存储的内容,直接通过链表的话,里面存的就是一个对象,对象里面可以想放什么就放什么,通过对象,然后在通过对象的下一个地址,就可以将一串的数据连接起来,形成一个链表,这种方式的设计,完全趋同与线性表的设计,是两种方向的思想,之前的线性表在进行设计的时候,必须是连续的,而对于非连续的数据想要实现就变的非常的困难。
链表就是为了解决非连续的数据来进行设计的,在进行设计非连续的数据的时候,通过任意修改指针的执行,就可以修改下一个元素的内容和要执行的下一个数据的方向,这种对数据排序的操作可以说是非常方便的。对比线性表的操作,大部分都是element[i-1]=element[i];后一个元素往前挪,或者前一个元素往后挪的这种操作,而链表的这种操作,则更多的在操作next,指向的操作,这个可以说是灵魂所在,他不不是直接去移动数据了,而是去移动对象里面有关移记录数据位置的直向,更直接的还是偏向于在对应的对象的层面的设计思想,这其实是用针对面向对象的思想去解决了数据存储的问题,这个问题我之前一直没有深刻的意识到,如果没有意识到这个面向对象的思想在数据中存储的优势所在,在后面的二叉树和图这个方面,会有大量的Node<E>出现代码会变得非常的庞大,逻辑会有点复杂,都是为了解决上一个存储结构的不够便利,采用面向对象进行优化的,总得来说,面向对象的思想在数据结构中也处处可在。明天再放上代码,还需要更深刻的思考才行。
积累,专注,持之以恒的坚持
2023.07.03