一.单向链表

单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域。这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值。
Python数据结构与算法学习第三天
1.表元素域elem用来存放具体的数据。
2.链接域next用来存放下一个节点的位置(python中的标识)
3.变量p指向链表的头节点(首节点)的位置,从p出发能找到表中的任意节点。
①.节点利用代码实现:
Python数据结构与算法学习第三天
②.单链表的操作与代码实现:

(1) is_empty() 链表是否为空
Python数据结构与算法学习第三天
(2)length() 链表长度
Python数据结构与算法学习第三天
上图代码中,cur类似于指针,刚开始时,cur位于头节点,循环条件为,当cur不指向None时,则count自加1,随后,指针cur指向下一个节点,并与循环条件做判断,若不符合,则返回count的值。

(3)travel() 遍历整个链表
Python数据结构与算法学习第三天
上图代码与length()函数相类似,只不过是指针每次指到一个节点时,则输出当前节点的值。

(4)add(item) 链表头部添加元素
Python数据结构与算法学习第三天
上图代码为链表头部添加元素,将新插入的节点中,next中的值先改为当前头节点所指向的对象,即原来的第一个元素,再将头节点指向新插入的节点。(如果反过来操作,则最后无法找到原来的对象)

(5)append(item) 链表尾部添加元素
Python数据结构与算法学习第三天
上图代码为链表尾部添加元素,先判断是否为特殊情况,如果该链表为空,则直接将头节点指向新插入的元素。在一般情况下,先定义指针,然后遍历每一个元素,直到最后一个元素的next指向None时,才将该元素的next指向新元素。

(6)insert(pos, item) 指定位置添加元素
Python数据结构与算法学习第三天
上图代码为在指定位置插入元素,pos代表位置,在特殊情况下,若pos小于等于0是,则意味着在头节点插入,就调用自身的add()函数。第二个特殊情况是如pos大于元素的个数-1的话(因为pos第一个位置是从0开始算起),则在尾部插入,调用自身的append()函数。一般情况下,首先定义一个指针pre,while的作用是将指针指到插入位置的前一个元素,找到该位置后,先将前一个元素指向的下一个元素的值给了新插入值的next部分,再将先前元素的next的值改为新元素。

(7)remove(item) 删除节点
Python数据结构与算法学习第三天
上图代码为删除节点中的元素,先定义两个指针,其中一个指针落后于一个指针一个元素。先做遍历,用指针寻找所删除的元素的值,特殊情况是当找到元素时,若该元素是头元素,则将头元素指向第一个元素的next值,然后跳出循环。一般情况为,当找到该元素后,pre为该元素的前一个元素,而cur指向当前元素,则将前一个元素的next指向cur的next,完成删除,跳出循环。

(8)search(item) 查找节点是否存在
Python数据结构与算法学习第三天
上图为查找节点是否存在,定义指针,先遍历每一个元素,如果指针指向的元素的元素值等于item,则返回true,否则,返回false。

结果:
Python数据结构与算法学习第三天
Python数据结构与算法学习第三天

二.链表与顺序表的对比

链表失去了顺序表随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大,但对存储空间的使用要相对灵活。

链表与顺序表的各种操作复杂度如下所示:
Python数据结构与算法学习第三天
注意虽然表面看起来复杂度都是 O(n),但是链表和顺序表在插入和删除时进行的是完全不同的操作。链表的主要耗时操作是遍历查找,删除和插入操作本身的复杂度是O(1)。顺序表查找很快,主要耗时的操作是拷贝覆盖。因为除了目标元素在尾部的特殊情况,顺序表进行插入和删除时需要对操作点之后的所有元素进行前后移位操作,只能通过拷贝和覆盖的方法进行。

相关文章: