一方向チェーンテーブルの削除変更操作
: , 。 “ ”, : (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のみ)ため、余分なループを減らすには、ヘッダノードであるか否かを判断する条件を外置するしかない.もっと良い解決策があるはずですが、私はしばらく考えられませんでした.