顺序表的构建需要预先知道数据大小来申请连续的存储空间,而在进行扩充时又需要进行数据的搬迁,所以使用起来并不是很灵活。链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。
链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是不像顺序表一样连续存储数据,而是在每一个节点(数据存储单元)里存放下一个节点的位置信息(即地址)。
单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域。这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值。
表元素域elem用来存放具体的数据。链接域next用来存放下一个节点的位置(python中的标识)变量p指向链表的头节点(首节点)的位置,从p出发能找到表中的任意节点。 通过例子理解下列的操作在链表为空时,都可以成立
因此检测链表是否为空,可以对链表中的值进行None判断。
// An highlighted block """判断链表是否为空""" def is_empty(self): return self._head == None逐个对元素进行判断,直到None。
// An highlighted block """链表长度""" def length(self): cur = self._head # cur初始时指向头节点 count = 0 while cur != None: # 尾节点指向None,当未到达尾部时 count += 1 cur = cur.next # 将cur后移一个节点 return count结合上一个图,当游标所指的为None,则遍历结束。
// An highlighted block """遍历链表""" def travel(self): cur = self._head while cur != None: print(cur.item,end="\t") cur = cur.next print(end="\n")判断最后一个节点的下一个节点是否为None
// An highlighted block """尾部添加元素""" def append(self, item): node = SingleNode(item) if self.is_empty(): # 先判断链表是否为空,若是空链表,则将_head指向新节点 self._head = node # 若不为空,则找到尾部,将尾节点的next指向新节点 else: cur = self._head while cur.next != None: #判断下一个节点是否为None cur = cur.next cur.next = node首先将待添加元素指向head,防止后续链表的丢失。
// An highlighted block """头部添加元素""" def add(self, item): node = SingleNode(item) node.next=self._head self._head=node判断指定节点的前一个节点,对元素进行添加
// An highlighted block """在指定位置添加元素 添加的元素是 (2,50),则pos=2 """ def insert(self, pos, item): #判断指定位置是进行头部添加还是尾部添加 if pos <= 0: self.add(item) elif pos > (self.length() - 1): self.append(item) else: node = SingleNode(item) cur = self._head count = 0 # 通过计数判断是否移动到指定位置的前一个位置 while count<(pos - 1): count+=1 cur = cur.next node.next = cur.next cur.next = node判断cur位置的数据是否是要找的数据
// An highlighted block """查找节点是否存在""" def search(self, item): cur = self._head while cur != None: if cur.item == item: print("True") return True else: cur = cur.next print("False") return False通过cur和pre两个游标寻找指定节点
// An highlighted block """删除一个节点""" def remove(self, item): # 若链表为空,则直接返回 cur = self._head pre = None # 若头节点的元素就是要查找的元素item while cur!= None: if cur.item==item: #先判断此节点是否为头结点 if cur==self._head: self._head=cur.next else: pre.next=cur.next break else: pre=cur cur=cur.next