利用python实现了双向链表,方法如下
1 is_empty() 判断链表是否为空
2 clear() 清空链表
3 len() 链表的长度
4 iteration() 遍历链表返回一个链表内容的list
5 leftappend(item) 从头部插入一个 节点
6 append(item) 从尾部追加一个节点
7 exist(item) 判断item是否在链表中
8 insert(index,item) 指定位置插入
9 remove(item) 删除内容为item的节点
具体如代码
class Node(object):
"""双向链表节点"""
def __init__(self,item):
self.item = item
self.next = None
self.prev = None
class DLinkList(object):
"""双向链表"""
def __init__(self):
self.__head = None
self.__len = 0
def is_empty(self):
"""判断链表是否为空"""
return self.__head == None
def clear(self):
"""清空链表"""
self.__head = None
self.__len = 0
def __len__(self):
"""返回链表的长度"""
return self.__len
def iteration(self):
"""遍历链表"""
cursor = self.__head
res_list = []
while cursor != None:
res_list.append(cursor.item)
cursor = cursor.next
return res_list
def leftappend(self,item):
"""从头部添加一个节点"""
new_node = Node(item)
if self.is_empty():
self.__head = new_node
else:
# new_node.next 指向self.__head
new_node.next = self.__head
# self.__head.prev指向new_node
self.__head.prev = new_node
# self.__head 指向new_node
self.__head = new_node
self.__len += 1
def append(self,item):
"""从尾部追加"""
new_node = Node(item)
if self.is_empty():
self.__head = new_node
else:
cursor = self.__head
while cursor.next != None:
cursor = cursor.next
# 最后一个节点的next指向new_node
cursor.next = new_node
# new_node的prev指向cursor
new_node.prev = cursor
self.__len += 1
def exist(self,item):
"""查找item是否存在于链表中"""
cursor = self.__head
while cursor != None:
if cursor.item == item:
return True
cursor = cursor.next
return False
def insert(self,index,item):
"""在指定位置插入节点"""
if index <= 0:
self.leftappend(item)
elif index >= self.__len:
self.append(item)
else:
new_node = Node(item)
i = 0
cursor = self.__head
while i < index - 1:
i += 1
cursor = cursor.next
# 把new_node插入到cursor的后面
# 新节点的next指向游标的next
new_node.next = cursor.next
# 新节点的prev指向游标
new_node.prev = cursor
# 游标的next的Prev指向新节点
cursor.next.prev = new_node
# 游标的next 指向新节点
cursor.next = new_node
self.__len += 1
def remove(self,item):
if not self.exist(item):
return
else:
cursor = self.__head
while cursor != None:
if cursor.item == item:
# 判断是否为头节点,头节点的prev都为空
if cursor.prev == None:
self.__head = cursor.next
if cursor.next:
# 头节点的prev都为空
cursor.next.pre = None
else:
cursor.prev.next = cursor.next
# 如果存在下一个节点则设置下一个节点的prev
if cursor.next:
cursor.next.prev = cursor.prev
break
else:
cursor = cursor.next
self.__len -= 1
if __name__ == '__main__':
dlinklist = DLinkList()
print(len(dlinklist))
print(dlinklist.is_empty())
dlinklist.leftappend(1)
print(dlinklist.exist(1))
print(len(dlinklist))
print(dlinklist.is_empty())
print(dlinklist.iteration())
dlinklist.leftappend(2)
dlinklist.append(3)
print(dlinklist.iteration())
dlinklist.insert(0,5)
print(dlinklist.iteration())
dlinklist.insert(2,4)
print(dlinklist.iteration())
dlinklist.insert(4,7)
print(dlinklist.iteration())
dlinklist.remove(7)
print(dlinklist.iteration())
print(dlinklist.is_empty())
print(len(dlinklist))
dlinklist.clear()
print(len(dlinklist))
print(dlinklist.is_empty())
# 0
# True
# True
# 1
# False
# [1]
# [2, 1, 3]
# [5, 2, 1, 3]
# [5, 2, 4, 1, 3]
# [5, 2, 4, 1, 7, 3]
# [5, 2, 4, 1, 3]
# False
# 5
# 0
# True