刚刚开始学习python,在尝试实现双向链表中,移除第一个值为data的节点这个方法时,当删除的节点为第一个节点,遇到了一些问题
当删除第一个节点时,我需要先将头节点self.head指向第二个节点,但是否需要使第二个节点的prev指针指向None吗?因为我发现若不把第二个节点的prev指针指向None,代码还是正常运行的,不管是双向链表内的元素个数还是别的功能都是正常的,但我发现第二个节点的prev仍然指向了删除掉的第一个节点,这样是不是代表第一个节点没有被真正的删除,其数据还是保存在计算机里的呢
remove功能代码如下
def remove(self, data):
cur = self.head
while cur:
if cur.data == data:
# 判断是否为头节点
if cur == self.head:
self.head = cur.next
# cur.next.prev = None
print(cur.next.prev.data) # 我添加了这一行代码发现第二节点的prev仍然指向删除的节点
else:
cur.prev.next = cur.next
# 判断是否为尾节点
if cur.next:
cur.next.prev = cur.prev # 如果不是尾节点,才能执行这句
self.length -= 1
return 0
cur = cur.next
return -1
我想的是在判断是否为头节点时,再添加一个判断,即是否链表中只有一个节点,因为此时cur.next是None,如果使用cur.next.prev = None会报错,请问这样可以吗
”
这样写肯定是会输出被“删除”的结点
因为你所谓的“删除”是你的在逻辑上把它删了,并没有回收它的内存
而如果你让next的prev指向None,也肯定是报错,因为None没有data
if cur == self.head:
self.head = cur.next
# cur.next.prev = None
print(cur.next.prev.data)
此处代码并未将cur的next的pre修改,所以2依然指向被“删除”的1