双向循环链表
# coding :utf-8
class LinkListNode(object):
"""双向循环链表节点"""
def __init__(self, value):
# 上指针
self.prev = None
# 值
self.value = value
# 下指针
self.next = None
class DoubleLoopLinkList(object):
"""双向循环链表"""
def __init__(self):
'''初始化链表'''
self.__head = None
def is_empty(self):
'''判断链表是否为空'''
return self.__head is None
def length(self):
'''获取链表长度'''
if self.is_empty():
return 0
count = 1
cur = self.__head
while cur.next != self.__head:
count += 1
cur = cur.next
return count
def travel(self):
'''遍历链表'''
if self.is_empty():
print("")
cur = self.__head
print(cur.value, end=" ")
while cur.next != self.__head:
cur = cur.next
print(cur.value, end=" ")
print()
def add(self, item):
'''链表头部添加'''
node = LinkListNode(item)
if self.is_empty():
node.prev = node
node.next = node
self.__head = node
else:
cur = self.__head
node.prev = cur.prev
node.next = cur
cur.prev.next = node
cur.prev = node
self.__head = node
def append(self, item):
'''链表尾部添加'''
node = LinkListNode(item)
if self.is_empty():
self.add(item)
else:
cur = self.__head
node.prev = cur.prev
node.next = cur
cur.prev.next = node
cur.prev = node
def insert(self, pos, item):
'''指定位置插入'''
if pos <= 0:
self.add(item)
elif pos > (self.length() - 1):
self.append(item)
else:
cur = self.__head
count = 0
while count < (pos - 1):
count += 1
cur = cur.next
node = LinkListNode(item)
node.prev = cur
node.next = cur.next
cur.next.prev = node
cur.next = node
def remove(self, item):
'''删除节点'''
cur = self.__head
if self.is_empty():
return print("链表为空")
elif self.length() == 1:
self.__head = None
else:
while cur.next != self.__head:
if cur.value == item:
if cur == self.__head:
self.__head = cur.next
cur.next.prev = cur.prev
cur.prev.next = cur.next
else:
cur.next.prev = cur.prev
cur.prev.next = cur.next
return
cur = cur.next
if cur.value == item:
cur.next.prev = cur.prev
cur.prev.next = cur.next
def search(self, item):
'''查找节点是否存在'''
if self.is_empty():
return False
cur = self.__head
while cur.next != self.__head:
if cur.value == item:
return True
cur = cur.next
if cur.value == item:
return True
return False
if __name__ == "__main__":
ll = DoubleLoopLinkList()
ll.add(1)
ll.add(2)
ll.travel()
ll.append(3)
ll.travel()
ll.insert(2, 4)
ll.travel()
ll.insert(4, 5)
ll.travel()
ll.insert(0, 6)
ll.travel()
print("length:", ll.length())
ll.travel()
print(ll.search(3))
print(ll.search(7))
ll.remove(1)
ll.remove(2)
# ll.remove(5)
# ll.remove(4)
# ll.remove(3)
ll.remove(6)
ll.travel()
print("length:", ll.length())
# ll.travel()