首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >链接列表正在删除指定值的所有实例

链接列表正在删除指定值的所有实例
EN

Stack Overflow用户
提问于 2017-03-23 06:49:37
回答 1查看 1.3K关注 0票数 0

我在删除链表中所有相同值的实例时遇到了很多麻烦。我知道这个问题与remove函数的self.head部分有关。

代码语言:javascript
运行
复制
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

预期结果:[]

EN

回答 1

Stack Overflow用户

发布于 2017-03-23 07:17:45

我认为您的remove代码比它所需要的要复杂一些(使用嵌套循环等)。你应该能够让它工作得更简单一点。

下面是我如何使用两个循环,一个接一个。第一个循环用于前导节点,其中包含您要删除的值。第二个循环用于处理列表的其余部分。

代码语言:javascript
运行
复制
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相同),因此很可能不会注意到返回值,除非您从交互式会话调用函数。异常要有用得多,因为当它们发生在预期之外的地方时,它们会中断程序流(这对调试很有好处)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42964090

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档