python 实现链表的增删改查(双向链表)

 ###节点类
###三个属性,节点值,前向指针,后向指针
class
Node(): def __init__(self,value,next,prev): self.value = value self.next = next self.prev = prev
###操作链表类
class Link(): def __init__(self,value): self.link_create(value)
  #链表元素个数
def link_count(self): print("link's len is %d"%self.count)
  #创建链表
def link_create(self,value): self.head = Node(value,None,None) self.tail = self.head self.count = 1

#在链表指定位置添加元素 def link_push_index(self,index,value): temp_next = Node(value,None,None) if index <= 1: #index < 1时,头加 temp_next.next = self.head self.head = temp_next elif index >= self.count: #index >链表长度时,尾加 self.tail.next = temp_next temp_next.prev = self.tail self.tail = temp_next else:        #链表指定位置加 num = 1 temp_node = self.head while num != index: num = num + 1 temp_node = temp_node.next temp_node_prev = temp_node.prev temp_node.prev = temp_next temp_next.next = temp_node temp_next.prev = temp_node_prev temp_node_prev.next = temp_next self.count += 1   #添加元素-默认尾加 def link_push(self,value): temp_next = Node(value,None,None) temp_prev = self.tail self.tail.next = temp_next self.tail = temp_next self.tail.prev = temp_prev self.count += 1
#删除指定位置元素 def link_pop_index(self,index): if index <= self.count and index > 0: if index == 1: temp_node = self.head self.head = temp_node.next else: temp_num = 1 temp_node = self.head while temp_num != index : temp_node = temp_node.next temp_num = temp_num + 1 temp_node.prev.next = temp_node.next temp_node.next.prev = temp_node.prev self.count -= 1 else: print("Error:the link only have %d node"%self.count)
  #删除第一个找到的目标元素
def link_pop_value_one(self,value): if self.count >0: if value == self.head.value: temp_node = self.head self.head = temp_node.next self.count -= 1 else: temp_node = self.head while temp_node != None and temp_node.value != value: temp_node = temp_node.next if temp_node == None: print("the link not have %s"%value) else: temp_node.prev.next = temp_node.next temp_node.next.prev = temp_node.prev self.count -= 1 else: print("the link is empty!")   #删除链表中全部目标元素 def link_pop_value_all(self,value): if self.count >0: temp_node = self.head while temp_node != None: if self.head.value == value: temp_node = self.head self.head = temp_node.next temp_node = self.head self.count -= 1 else: if temp_node.value == value:
             if temp_node.next != None:
temp_node.prev.next = temp_node.next temp_node.next.prev = temp_node.prev
else:
self.tail = temp_node.prev
self.tail.next = None self.count
-= 1 temp_node = temp_node.next else: print("the link is empty!")   

  #修改指定位置元素的值
def link_alter_index(self,num,value): temp_node = self.head temp_num = 1 if num > 0 and num <= self.count: while temp_num != num: temp_num += 1 temp_node = temp_node.next temp_node.value = value else: print("Error:the link only have %d node"%self.count)
  #修改第一个找到的目标元素的值
def link_alter_value_one(self,value_old,value_new): temp_node = self.head while temp_node != None and temp_node.value != value_old: temp_node = temp_node.next if temp_node == None: print("the link not have %s"%value_old) else: temp_node.value = value_new
  #修改链表中全部目标元素的值
def link_alter_value_all(self,value_old,value_new): temp_node = self.head while temp_node != None: if temp_node.value == value_old: temp_node.value = value_new temp_node = temp_node.next
  #打印链表(正序)
def link_print(self): temp_node = self.head while temp_node != None: print temp_node.value temp_node = temp_node.next


#调用及结果
#创建链表
head = Link("head")  
for i in range(8):
    head.link_push(i) 

head.link_print()
head.link_count()
  
head.link_pop_index(2)    #删除第2个元素
head.link_print()
head.link_count()
  
head.link_push(5)  #添加元素5
head.link_print()
head.link_count()
  
head.link_push_index(3,1000)   #在第三个位置添加 1000
head.link_print()
head.link_count()
  

head.link_pop_value_one(1000) #删除元素1000
head.link_print()
head.link_count()
  
head.link_pop_value_all(5)  #删除所有元素5
head.link_print()
head.link_count()
  
head.link_alter_index(1,1995)
head.link_print()
head.link_count()

head.link_alter_value_one(15,5)
head.link_print()
head.link_count()

head.link_alter_value_all(5,118)
head.link_print()
head.link_count()

 

原文地址:https://www.cnblogs.com/chunqiu666/p/12843872.html