链表
链表属于线性结构,在地址中是散放的,所以不连续。
虽然可以使用索引访问,但是只有上一个元素才知道下一个元素的地址,所以不适合查询。
链表适合增删。
单链表的实现
class Node:
def __init__(self,item,next=None):
self.item=item
self.next=next
def __repr__(self):
return str(self.item)
class LinkedList:
def __init__(self):
self.head=None
self.tail=None
def append(self,item):
node=Node(item)
if self.head==None:
self.head=node
else:
self.tail.next=node
self.tail=node
def iternodes(self):
current=self.head
while current:
yield current
current=current.next
lst=LinkedList()
lst.append(1)
lst.append(2)
lst.append(3)
lst.append(4)
for i in lst.iternodes():
print(i)
双链表的实现
class Node:
def __init__(self, item, prev=None, next=None):
self.item = item
self.next = next
self.prev = prev
def __repr__(self):
return '{}'.format(self.item)
class LinkedList:
def __init__(self):
self.head = None
self.tail = None
self.size = 0
def append(self, item):
node = Node(item)
if self.head is None:
self.head = node
self.tail = node
else:
self.tail.next = node
node.prev = self.tail
self.tail = node
self.size+=1
return self
def pop(self):
if self.head is None:
raise Exception('Empty')
node = self.tail # 链表的尾部
item = node.item # 尾部的值
prev = node.prev
if prev is None: # only one
self.head = None
self.tail = None
else:
prev.next = None
self.tail = prev
self.size-=1
return item
def insert(self, index, item):
if index < 0:
raise IndexError
current = None
for i, nodes in enumerate(self.iter_nodes()):
if i == index:
current = nodes
break
else: # 没有break,尾部追加
self.append(item)
return
node = Node(item)
prev = current.prev
next = current
if prev is None:
self.head = node
node.next = next
next.prev = node
else:
prev.next = node
next.prev = node
node.prev = prev
node.next = next
self.size+=1
def remove(self, index):
if self.tail is None:
raise Exception('Empty')
if index < 0:
raise IndexError
current = None
for i, nodes in enumerate(self.iter_nodes()):
if i == index:
current = nodes
break
else:
raise IndexError
prev = current.prev
next = current.next
if prev is None and next is None:
self.head = None
self.tail = None
elif prev is None: # 头部
self.head = next
next.prev = None
elif next is None: # 尾部
self.tail = prev
prev.next = None
else: # 在中间
prev.next = next
next.prev = prev
del current
self.size-=1
def iter_nodes(self, reverse=False):
current = self.head if not reverse else self.tail
while current:
yield current
current = current.next if not reverse else current.prev