Python 删除变量(指针)值并不是删除它所指向的值
我正在编写一个链表的实现,链表类及其节点如下所示:Python 删除变量(指针)值并不是删除它所指向的值,python,linked-list,Python,Linked List,我正在编写一个链表的实现,链表类及其节点如下所示: class Node: def __init__(self, data, next = None): self.element = data self.next = next class LinkedList: def __init__(self, head): self.head = head def insert(self, next): node
class Node:
def __init__(self, data, next = None):
self.element = data
self.next = next
class LinkedList:
def __init__(self, head):
self.head = head
def insert(self, next):
node = self.head
while node.next:
node = node.next
node.next = next
def remove(self, element):
node = self.head
while node:
if node.element == element:
if node.next:
node.element = node.next.element;
node.next = node.next.next;
else:
print(node.element)
node = None;
break;
node = node.next
def get(self, element):
node = self.head
while node:
if node.element == element:
return node
node = node.next
return None
我正在测试remove方法,当我试图删除链表的最后一个元素时,它不起作用。在本例中,最后一个元素应该设置为“None”,正如您在下面的代码段中所看到的(包含在上面的类中)
然而,最后一个元素没有被删除,我不知道为什么。我假设节点
将是指向最后一个元素的指针,并且该值将设置为无
,但是它不会被删除。以下是失败的测试:
class Test(unittest.TestCase):
def test_remove_node(self):
head = Node('a', Node('b', Node('c')));
ll = LinkedList(head);
ll.remove('c');
self.assertEqual(head.element, 'a');
self.assertEqual(head.next.element, 'b');
print(head.next.next.element);
self.assertIsNone(head.next.next);
if __name__ == "__main__":
unittest.main()
节点
是一个临时局部变量,包含对感兴趣节点的附加引用。将其设置为None
不会改变列表的结构,就像在循环的每次迭代中更新它一样:
node
v
head -> a -> b -> c -> None
vs
要正确更改列表的内容,必须更新上一个节点中的指针。您可以通过在迭代时跟踪父级来实现这一点:
def remove(self, element):
node, parent = self.head, None
while node:
if node.element == element:
if parent:
parent.next = node.next
else:
self.head = node.next
break
node, parent = node.next, node
您不需要复制元素,也不需要查看节点。下一步。只需绕过包含感兴趣元素的节点就足够了。
节点
从技术上讲是指向元素的指针(或“引用”)。如果将其设置为None
,则会设置此指针,但不会修改元素本身,也不会更改指向同一元素的任何其他指针。虽然没有完全错误,但我发现您(不一致)使用分号会让人微妙地不安:)
node
v
head -> a -> b -> c -> None
def remove(self, element):
node, parent = self.head, None
while node:
if node.element == element:
if parent:
parent.next = node.next
else:
self.head = node.next
break
node, parent = node.next, node