我在删除链表中所有相同值的实例时遇到了很多麻烦。我知道这个问题与remove函数的self.head部分有关。
class Node:
def __init__(self,data):
self.data = data
self.next = None
def getData(self):
return self.data
def getNext(self):
return self.next
def setData(self,newdata):
self.data = newdata
def setNext(self,newnext):
self.next = newnext
class UnorderedList:
def __init__(self):
self.head = None
#Checks to see if the list is empty
def isEmpty(self):
return self.head == None
#Adds the item at the beginning of the list
def add(self,item):
temp = Node(item)
temp.setNext(self.head)
self.head = temp
#Prints the Unordered List
def __str__(self):
result = "["
current = self.head
if current != None:
result += str(current.data)
current = current.next
while current:
result += ", " + str(current.data)
current = current.next
result += "]"
return result
# Removes a specified item from the list
def remove(self, item):
if self.head == None:
return 'Cannot remove from an empty list'
current = self.head
while current != None:
iterator = current
while iterator != None:
prev = iterator
iterator = iterator.getNext()
if iterator is None:
break
if iterator.getData() == item:
Next = iterator.getNext()
prev.setNext(Next)
current = current.getNext()
mylist = UnorderedList()
for i in range(50):
mylist.add(2)
mylist.remove(2)
print(mylist)结果2,2,2,2,2
预期结果:[]
发布于 2017-03-23 07:17:45
我认为您的remove代码比它所需要的要复杂一些(使用嵌套循环等)。你应该能够让它工作得更简单一点。
下面是我如何使用两个循环,一个接一个。第一个循环用于前导节点,其中包含您要删除的值。第二个循环用于处理列表的其余部分。
def remove(self, item):
if self.head == None:
return 'Cannot remove from an empty list' # note, you may want to raise an exception
while self.head is not None and self.head.data == item: # first loop, for leading values
self.head = self.head.next
if self.head is not None: # rest is only needed if the first loop didn't empty the list
current = self.head
while current.next is not None: # second loop, over all later items
if current.next.data == item: # check for matching items
current.next = current.next.next # and remove them
else:
current = current.next我省略了对getter和setter函数的调用,因为它们让人分心,而且在Python代码中通常不是必需的。在其他语言中使用getter和setter函数有很好的理由,但在Python中直接使用属性通常很好(如果需要在不更改property的情况下更改它们的实现方式,可以稍后将它们转换为API描述符)。如果这是一个家庭作业,你可能需要去修改一下。
正如我在代码中注释的那样,在第一个if块中使用类似raise ValueError("cannot remove from an empty list")的内容可能也比较合适,而不是将错误消息作为字符串返回。remove方法通常不返回任何内容(这与返回None相同),因此很可能不会注意到返回值,除非您从交互式会话调用函数。异常要有用得多,因为当它们发生在预期之外的地方时,它们会中断程序流(这对调试很有好处)。
https://stackoverflow.com/questions/42964090
复制相似问题