今天是人生第一次写博客,记录自己学习的每一步,有些写的不好望指正。
自己之前在学习链表的时候总是会被一些很基本的问题搞得头晕脑胀,我觉得,晦涩难懂这就是很多初学者对链表的第一印象,书上的概念实在是太难理解了,对我们这些学渣很不友好,在这里我会用自己的方式和大家讨论一下链表究竟是什么存在。
一、链表(linked list)的基本概念
链表实际上是线性表的链式存储结构,与数组不同的是,链式存储并不要求数据项都顺序存放,可以散落在内存的各个角落。且链表的长度不是固定的,链表数据的这一特点使其可以非常的方便地实现节点的插入和删除操作
什么意思呢,我们在使用python列表的时候,如果我们需要删除列表当中的一个元素,或者说我们需要在当中插入一个元素,我们需要把这个列表中这个元素后面的数据项统统往前或是往后移一项,也就是我们熟知的***insert(n),pop(n)***,这两项操作的时间复杂度都是O(n)的,我们会想到这会不会是一种很笨的方法,可在python采取这样的方式也是有着python自己的妥协的。链表的存在就让我们可以更快的实现删除和插入。
在这里我们可以看见,这里的数据项没有任何规律的排布,但是只要在各个数据项之间建立我们所说的链,就可以顺序的读取我们的数据项,如果我们需要删除一个数据项,只需要剪断这一项和前后的链接就好了,我们可以把每一个数据项想象成一个树桩,而链接数据的链我们把它想象成绳子,如果我们要删除一个数据项,只需要直接把代表这个数据项的树桩前后的绳子直接连接,越过这个树桩即可,对于前后数据项的位置不需要有任何变化,如此一来,时间是不是就可以大大减少了呢。
二、链表中最基本元素:节点(Node) 以及创建一个单向链表
好,我们前面所说的树桩,在这里我们就不能再叫他树桩了,因为我们给他起了一个好听的名字:节点;
每个节点都至少会有两个信息,一个是数据项本身,一个是指向下一个节点的引用信息,在这里可以把数据项想象成树桩本身,引用信息可以想象成树桩上的钉子,你问我干嘛用的?当然是用来绑绳子的。看图!!
这里的temp可以看成是上一个节点的钉子,然后呢一条绳子绑在了本节点上,然后这个节点又伸出来一条绳子伸向了下一个节点。(这里注意观察next,下一个节点是一个空节点,所以显示next为None,圈起来)
这些元素共同组成了一个重要的结构:链表
那么我们现在就来在python当中实现创建一个单向链表吧,来人呐,上代码:
def Node:
def __init__(self,data):
self.data = data
self.next = None
好的,这里的data就是我们这个树桩,啊不对,是节点的本体,也就是数据项了,这里的next呢,就是我们伸向下一个节点的绳子,这里我们使下一个节点是None。
那如果想要获取节点中的数据或者说我需要更新节点中的数据应该怎么办呢,很简单:
def getdata(self):
return self.data
def update(self,newdate):
self