概念
双向链表是一种更复杂的链表,每个节点有两个指针域,一个指向前一个节点,如果当前节点为头节点时,指向空值;另一个链接指向下一个节点,如果当前节点为尾节点时,指向空值。
以一个简单的例子进行演示,如下,
双向链表节点实现
class DoubleNode:
def __init__(self, item):
self.prev = None
self.next = None
self.item = item
双向链表实现
双线链表的操作与单向链表相同,
class DoubleLinkList:
def __init__(self, node=None):
self.__head = node
if node is None:
self.__count = 0
else:
self.__count = 1
def is_empty(self):
return self.__head is None
def length(self):
return self.__count
def travel(self):
cur = self.__head
while cur is not None:
yield cur.item
cur = cur.next
def add(self, item):
node = DoubleNode(item)
# 判断链表是否为空
if self.is_empty():
self.__head = node
else:
node.next = self.__head
self.__head = node
node.next.prev = node
self.__count += 1
def append(self, item):
node = DoubleNode(item)
# 判断链表是否为空
if is_empty():
self.__head = node
else:
cur = self.__head
while cur.next != None:
cur = cur.next
cur.next = node
node.prev = cur
self.__count += 1
def insert(self, item, pos):
if pos <= 0:
self.add(item)
elif pos > self.__count - 1:
self.append(item)
else:
pre = self.__head
count = 0
while count < pos - 1:
count += 1
pre = pre.next
node = DoubleNode(item)
node.next = pre.next
node.prev = pre
pre.next.prev = node
def remove(self, item):
cur = self.__head
pre = None
while cur is not None:
if cur.item == item:
# 如果当前节点是头节点
if cur == self.__head:
self.__head = cur.next
# 删除头节点后如果链表非空
if cur.next is not None:
cur.next.prev = None
# 如果当前节点不是头节点
else:
pre = cur.prev
pre.next = cur.next
# 如果当前节点之后非空
if cur.next is not None:
cur.next.prev = pre
break
else:
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