链表
-
# 链表的基本操作
class Node(object): def __init__(self, item): self.item = item self.next = None class SingLinkList(object): def __init__(self): self.head = None def is_empty(self): """链表是否为空""" return self.head is None def length(self): """ 链表长度""" n = 0 cur = self.head while cur is not None: n += 1 cur = cur.next return n def travel(self): """遍历整个链表""" cur = self.head while cur is not None: print(cur.item, end='-->') cur = cur.next print() def add(self, item): """链表头部添加元素""" node = Node(item) # 新节点的next指向原首节点 node.next = self.head # head 指向新节点 self.head = node def append(self, item): """ 链表尾部添加元素""" # 若链表为空, 则头部添加 if self.is_empty(): self.add(item) return # 找到尾节点 cur = self.head while cur.next is not None: cur = cur.next # 至此找到尾节点 # cur 指向新节点 node = Node(item) cur.next = node def insert(self, pos, item): """指定位置添加元素""" # pos --- 输入插入的位置 # 若插入位置小于等于0,则头部插入 if pos <= 0: self.add(item) return elif pos >= self.length(): self.append(item) return else: # 找到插入位置的前一个节点 cur = self.head for i in range(pos - 1): cur = cur.next # 新节点的next指向原cur的next node = Node(item) node.next = cur.next # cur的next指向新节点 cur.next = node def remove(self, item): """删除节点""" # 找到待删除节点并记录前一个节点 cur = self.head pre = None # 记录前一个节点 while cur is not None: if item == cur.item: # 若有前一个节点则pre.next = cur.next pre.next = cur.next else: # head指向cur的next self.head = cur.next return pre = cur cur = cur.next def search(self, item): """ 查找节点是否存在""" cur = self.head while cur is not None: if cur.item == item: return True cur = cur.next return False if __name__ == '__main__': sl = SingLinkList() # print(sl.length()) sl.add(1) sl.add(2) sl.add(3) sl.append('aa') sl.append('bb') sl.append('cc') sl.insert(-1, "xx") sl.insert(2, "yy") sl.travel() sl.insert(100, "zz") print(sl.length()) print(sl.is_empty()) sl.remove('yy') sl.travel() print(sl.search(1)) print(sl.search('xx')) - 链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。
-
单向链表也叫单链表,是链表的一种最简单的形式,它的每个节点都包含两个域,一个叫信息域一个叫链接域。这个链接指向链表中的下一个空值,最后一个链接域指向None(空值)
- 单链表结构分析
- 顺序表与链表时间复杂度分析
- 注意虽然表面看起来复杂度都是 O(n),但是链表和顺序表在插入和删除时进行的是完全不同的操作。链表的主要耗时操作是遍历查找,删除和插入操作本身的复杂度是O(1)。顺序表查找很快,主要耗时的操作是拷贝覆盖。因为除了目标元素在尾部的特殊情况,顺序表进行插入和删除时需要对操作点之后的所有元素进行前后移位操作,只能通过拷贝和覆盖的方法进行