- A+
链表
链表需要多个的节点连接起来
每个节点需要保存的为数据,下一个节点的地址,或上一个节点的地址(双向链表)
单向链表,有多个节点连接起来,
每个链表的起始地址,使用self._head保存,具体是实现代码如下
需要一个node类,实现每个节点的信息
如图
item 和后继节点位置
每个链表的基本操作如下:
is_empty() 判断链表是否为空
length() 返回链表的长度
travel() 遍历
add(item) 在头部添加一个节点
append(item) 在尾部添加一个节点
insert(pos, item) 在指定位置pos添加节点
remove(item) 删除一个节点
search(item) 查找节点是否存在
在链表的结构中 __init__()、is_empty()、 length() 的函数代码如图
遍历、添加到头部和添加到尾部的函数如图:
在添加节点到头部时,需要把N_node.next指向self._head(原来链表的起始位置),再把链表的起始位置指向新创建的节点;当链表为空时,过程也是如此,就不用再考虑特殊情况了。
在添加到末尾的位置时,需要考虑节点为空的情况,在添加到末尾的循环条件与遍历的条件不同,在遍历的循环条件为cur != None,在添加的时候
cur.next != None需要找到最后一个节点,在循环外,把next指向新节点
插入节点代码如下:
在插入节点的过程需要考虑插入位置与链表长度的关系,
在遍历找到插入位置时需要将新节点N_node.next =cur.next 在把cur.next =N_node
删除及查找的代码如下:
在删除的函数中需要两个游标来保存删除节点和删除目标节点的前驱节点,并需要判断删除的节点是第一节点,只需要把self._head = cur.next (cur 是第一节点),pre为删除的节点的前一个节点,删除时 pre.next = cur.next 然后退出循环,查找的函数只需要遍历过程中进行一一对比返回即可
单向循环链表的最后一个节点指向链表的起始位置
last_node.next = self ._head
单向循环列表与单向列表的不同点就在最后一个节点,在循环、头节点、尾节点是需要注意条件这里就不多解释了
双向链表的每个节点包括三个部分,
前驱节点
数据区
后继节点
如有连续的三个节点
self. _head node_1 node_2 node_ 3
三个节点的连接关系如下
self._head = node_1
node _1.next = node_2
node_1.pre = None
node_2.next=node_3
node_2.pre=node_1
node_3.next= None
node_3.pre =node_2
双向链表与单向列表相比,在添加,删除时需要注意前驱节点的变化
注意看截图中的注释
插入及删除的代码如下: