#coding = utf-8
#双向链表
classNode:#双向链表存在两个指标,一个向前,一个向后
def __init__(self, new_data):
self.data=new_data
self.prev=None
self.next=Nonedefget_data(self):returnself.datadefset_data(self, new_data):
self.data=new_datadefget_next(self):returnself.nextdefset_next(self, new_next):
self.next=new_nextdefget_prev(self):returnself.prevdefset_prev(self, new_prev):
self.prev=new_prevclassDoubleList:def __init__(self):
self.head=None#作头插入时,需要要注意插入顺序,
#总之。要注意不要丢失next和prev。
defadd(self, item):
node=Node(item)if notself.is_empty():#待插入节点的后继区指向原头节点
node.set_next(self.head)#原头节点的前驱区指向待插入节点
self.head.set_prev(node)#将head指向node
self.head =node#作尾插入时,需要先判断是否为空列表。因为空列表时,没有next。
#为空列表时,尾插入和头插入代码相同。
#当不为空时,需要循环到底,再作插入处理
defappend(self, item):
node=Node(item)ifself.is_empty():#将head指向node
self.head =nodeelse:#移动到链表尾部
current =self.headwhile current.get_next() is notNone:
current=current.get_next()#将尾节点cur的next指向node
current.set_next(node)#将node的prev指向cur
node.set_prev(current)#指定位置插入节点
definsert(self, pos, item):#相当于头插入
if pos <=0:
self.add(item)#相当于尾插入
elif pos >=self.size():
self.append(item)else:
node=Node(item)
count=0
current=self.head#先将游标指到要插入位置
while count < pos - 1:
count+= 1current=current.get_next()#将node的prev指向cur
node.set_prev(current)#将node的next指向cur的下一个节点
node.set_next(current.get_next())#将cur的下一个节点的prev指向node
current.get_next().set_prev(node)#将cur的next指向node
current.set_next(node)#删除指定节点数据
defremove(self, item):#删除时,不需要再使用一个prev变量了。因为双向链表本身有这个指针
current =self.headwhile current is notNone:if current.get_data() ==item:#在找到节点之后,需要判断是否为首节点
if current ==self.head:
self.head=current.get_next()#判断链表是否只有一个结点
ifcurrent.get_next():
current.get_next().set_prev(None)else:
current.get_prev().set_next(current.get_next())#如果存在下一个结点,则设置下一个结点
ifcurrent.get_next():
current.get_next().set_prev(current.get_prev())break
else:
current=current.get_next()#查找指定数据是否存在
defsearch(self, item):
current=self.head
found=Falsewhile current is notNone:if current.get_data() ==item:
found=True
current=current.get_next()returnfounddefis_empty(self):return self.head isNonedef __len__(self):returnself.size()defsize(self):
count=0
current=self.headwhile current is notNone:
count+= 1current=current.get_next()returncountdefshow(self):
current=self.headwhile current is notNone:print(current.get_data(), end=‘ ‘)
current=current.get_next()print(‘\n‘)if __name__ == ‘__main__‘:
d_list=DoubleList()print(d_list.is_empty())
d_list.add(5)
d_list.add(4)
d_list.add(76)
d_list.add(23)
d_list.show()
d_list.append(48)
d_list.show()
d_list.append(234)
d_list.show()
d_list.insert(2, 100)
d_list.show()
d_list.remove(5)
d_list.show()print(d_list.search(48))