一方向チェーンテーブルの削除変更操作


    :     ,            。           “  ”,      :      (item) +      (next),                  
    :       ;        ,         。     ,        
![       ](https://img-blog.csdnimg.cn/20200416143143124.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1NPUllVU0hJS0lOQU1J,size_16,color_FFFFFF,t_70)

チェーンテーブルには、データドメイン+ポインタドメイン(リンクドメイン)の各ノード:データ+リンクチェーンテーブルが作成されている場合、リスト内の要素を巡回、検索、削除、検索などの操作ができます.
#        
class Node(object):
	def __init__(self, data):
		self.data = data
		self.next = None


#        
class SingleLink(object):
	def __init__(self, node=None):
		self.head = node

#         
	def is_empty(self):
		return self.head is None

	def length(self):
		count = 0
		cur = self.head
		while cur:
			#        ,     ,      ,       
			count += 1
			cur = cur.next
		return count

	def travel(self):
		cur = self.head
		while cur:
			print(cur.data, end='')
			cur = cur.next

	def add(self,data):
		#    
		node = Node(data)
		#     self.head          , self.head    node.next Node.next      ,
		#             
		node.next = self.head
		#             self.head   
		self.head = node

#         :       None  ,         
	def addlast(self,data):
		node = Node(data)
		cur = self.head
#             ,   ,    self.head         
		if self.head == None:
			self.head = node
#     ,        
		else:
			while cur.next:
				cur = cur.next
			cur.next = node

#         
	def remove_list_item_by_ID(self, item_id):
		current_id = 1
		#    item_id  ,                  。
		current_node = self.head
		#           
		previous_node = None
		#              

		while current_node is not None:
			if current_id == item_id:
				#               ,     ,    self.head         
				#             next        next,          
				#            ,     , next   None,        next  None,     。
				if current_id != 1:
					previous_node.next = current_node.next
				elif current_id == 1:
					self.head = current_node.next
			current_node = current_node.next
			previous_node = previous_node.next
			current_id += 1
#     
	def insert_node(self, data, item_id):
		current_id = 1
		insert_node = Node(data)
		#      
		current_node = self.head
		while current_node is not None:
			if current_id == item_id:
				#                    ,     /   ,    add append
				if current_node.next is not None:
					insert_node.next = current_node.next
					current_node.next = insert_node
				elif current_node.next is None:
					current_node.next = insert_node
			elif item_id == 0:
				insert_node.next = current_node
				self.head = insert_node
				break
			current_node = current_node.next
			current_id += 1

	

最後に、ノードを挿入するには、次のように書く必要があります.
#     
def insert_node(self, data, item_id):
		current_id = 1
		insert_node = Node(data)
		#      
		current_node = self.head
		while current_node is not None:
			if current_id == item_id:
				#                    ,     /   ,    add append
				if current_id != 0 and current_node.next is not None:
					insert_node.next = current_node.next
					current_node.next = insert_node
				elif current_id == 0:
					insert_node.next = current_node
					self.head = insert_node
				elif current_node.next is None:
					current_node.next = insert_node
			current_node = current_node.next
			current_id += 1

しかし、item_がidが1の場合、コードがチェーンテーブルの先端にノードを挿入していることがわかります.item_id=2の場合、挿入ノードの位置は第2のノードではなく第3のノードになり、チェーンテーブルの位置に相当する一歩多くなった)、一方向チェーンテーブルが呼び出せないためである.preという属性は、前置挿入ができず、後置挿入しかできない(nextのみ)ため、余分なループを減らすには、ヘッダノードであるか否かを判断する条件を外置するしかない.もっと良い解決策があるはずですが、私はしばらく考えられませんでした.