算法-02-双链表

# 双向链表,每个结点都有两个指针域
class Node(object):
def __init__(self, item):
self.elem = item
self.next = None # 定义为指针
self.prev = None # 定义头指针

class DoubleLinkList(object):
def __init__(self, node=None):
self.__head = node

def is_empty(self):
return self.__head == None

def length(self):
count = 0
cur = self.__head
while cur != None:
count += 1
cur = cur.next
return count
def travel(self):
cur = self.__head
while cur != None:
print(cur.elem)
cur = cur.next
def add(self, item):
node = Node(item)
node.next = self.__head
self.__head.prev = node
self.__head = node
def append(self, item):
node = Node(item)
if self.is_empty():
self.__head = node
else:
cur = self.__head
while cur is not None:
cur.next = node
node.prev = cur
def insert(self, pos, item):
node = Node(item)
if pos <= 0:
self.add(item)
elif pos >= self.length()-1:
self.append(item)
else:
cur = self.__head
count = 0
while count != pos:
count += 1
cur = cur.next
'''方法一:
node.next = cur # 使新结点的尾指针指向插入位置的下一个结点
node.prev = cur.prev # 使新结点的头指针指向插入位置的前一个结点,用这两步实现新结点与前后结点之间的链接,为后面拆开原有前后结点之间的关系做铺垫
cur.prev.next = node # 使插入位置的前结点的尾指针指向新结点,从而拆开原有前后结点之间的链接
cur.prev = node # 使插入位置的头指针指向新结点,实现新结点与原前后结点最后的链接'''
#方法二:
node.next = cur
node.prev = cur.prev
cur.prev = node
cur.prev.next = node
# 二者连接顺序都是:先使新结点node的头指针与尾指针,与想插入位置的前后结点构成连接,当连接好后再思考如何拆开原有两个结点之间的连接
def remove(self, item):
cur = self.__head
while cur != None:
if cur.elem == item:
if cur == self.__head:
self.__head = cur.next
# 判断链表是否只有一个结点
if cur.next:
cur.next.prev = None
break
else:
cur.prev.next = cur.next
# 判断是否是在尾结点进行的删除,当cur.next存在时返回为真
if cur.next:
cur.next.prev = cur.prev
break
def search(self, item):
cur = self.__head
while cur != None:
if cur.elem == item:
return True
else:
cur = cur.next
return False


原文地址:https://www.cnblogs.com/gongteng/p/13567484.html