python实现双向链表
双向链表实现append、pop、insert、remove、iternodes
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
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
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
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
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