双向链表


'''
双向链表结构特征:
节点有: 数据域,向后的引用域和向前的引用域
头部节点的向前引用域指向None,尾部节点向后引用域指向None
'''

class Node(object):
def __init__(self,data):
# 前引用域
self.prev=None
# 后引用域
self.next=None
# 数据域
self.data=data

class DlinkList(object):
def __init__(self):
# 头节点
self.__head=None

# is_empty()链表是否为空
def is_empty(self):
return not self.__head

# length()链表长度
def length(self):
cur = self.__head
count = 0
while cur:
count += 1
cur = cur.next
return count

# travel()遍历链表
def travel(self):
cur=self.__head
while cur:
print(cur.data,end=' --> ')
cur=cur.next
print()

# add(item)链表头部添加
def add(self,data):
node=Node(data)
if self.is_empty():
self.__head=node
else:
node.next=self.__head
self.__head.prev=node
self.__head=node

# append(item)链表尾部添加
def append(self,data):
node=Node(data)
if self.is_empty():
self.__head=node
else:
cur=self.__head
while cur.next:
cur=cur.next
cur.next=node
node.prev=cur

# insert(index,data)指定位置添加元素
def insert(self, index, data):
if index <= 0:
self.add(data)
elif index >= self.length():
self.append(data)
else:
cur = self.__head
# 插入的位置是index, cur=cur.next偏移index-1次
for _ in range(index - 1):
cur = cur.next
node = Node(data)
node.next = cur.next
node.prev=cur
cur.next.prev=node
cur.next = node

# remove(item)删除节点
def remove(self,data):
cur=self.__head
while cur:
if cur.data==data:
if not cur.prev and not cur.next: # 只有一个元素
self.__head=None
if not cur.prev and cur.next: # 头部
self.__head=cur.next
cur.next.prev=None
elif not cur.next and cur.prev: # 尾部
cur.prev.next=None
else:
cur.prev.next=cur.next
cur.next.prev=cur.prev
cur=cur.next

# search(item)查找节点是否存在
def search(self, data):
cur = self.__head
while cur:
if cur.data == data:
return True
cur = cur.next
return False

if __name__ == '__main__':
d=DlinkList()
for i in range(1,11):
d.add(i)
print(d.is_empty())
d.travel()
d.append(100)
d.travel()
print(d.length())
print(d.search(3))
print(d.search(100))
d.remove(10)
d.remove(100)
d.remove(5)
d.travel()
d.insert(-2,0.02)
d.insert(100,1010)
d.insert(2,'mi')
d.travel()
posted @ 2021-02-07 22:53  涛子17180  阅读(49)  评论(0编辑  收藏  举报