【问题标题】:Python 3. Delete item from linked listPython 3. 从链表中删除项目
【发布时间】:2017-01-15 09:33:48
【问题描述】:

我在python中实现了链表,它完美地添加了元素并打印了列表。 但我对删除方法有问题。我想从列表中删除最后一项

这是我的班级 Cell():

class Cell():
def __init__(self, value = None, next = None):
    self.value = value
    self.next = next

这是我的类 LinkedList():

class LinkedList():
def __init__(self):
    self.top = None
    self.last = None
    self.length = 0

添加新单元的方法效果很好:

    def add (self, value, position = None):

    newCell = Cell(value, None)
    self.length += 1
    if position is None or position >= self.length:
        if self.top == None:
            self.last = self.top = Cell(value, None)
        else:
            self.last.next = self.last = Cell(value, None)
    elif position == 1:
        self.top = Cell (value, self.top)
    elif position > 1:
        afterMe = self.top
        i = 1
        for i in range(position-2):
            afterMe = afterMe.next
        newCell.next = afterMe.next
        afterMe.next = newCell

toString() 方法也很好用:

    def __str__(self):

    linkedList = ''
    cell = self.top
    if self.top is None:
        return 'Linked list is empty'

    for i in range(self.length):
        if cell == self.last:
            linkedList += (str(cell.value))
        else:
            linkedList += (str(cell.value)+ ', ')

        cell = cell.next
    return linkedList

这是我的删除方法,它会产生错误:

def delete(self, value = None):  # want to delete last cell
    if self.top == None:
        return None
    current = self.top

    if value is None:
        self.length -= 1

        while (current.next != self.last):
            current = current.next

        self.last = current
        current.next = None

    else:
        while (current.next.value != value):
            current = current.next
            if current == self.last:
                print ('no such value')
                return
        current.next = current.next.next

以下是代码的工作原理和错误:

numbers = LinkedList()
numbers.add(55)
numbers.add(75)
numbers.add(65)
print(numbers) # 55, 75, 65
numbers.add(3,2)
numbers.add (40,3)
print(numbers) # 55, 3, 40, 75, 65
numbers.delete()
print(numbers) # 55, 3, 40, 75
numbers.delete(40)
print(numbers)

    ''' returns error:
    Traceback (most recent call last):
    File "C:/Users/demin.va/Documents/Dropbox/Programming/Алгоритмы/связные списки.py", line 105, in <module>
    print(numbers)
  File "C:/Users/demin.va/Documents/Dropbox/Programming/Алгоритмы/связные списки.py", line 72, in __str__
    linkedList += (str(cell.value)+ ', ')
AttributeError: 'NoneType' object has no attribute 'value'
    '''

请回答,我应该如何更改代码以正确删除最后一个单元格或从不同位置删除?

【问题讨论】:

    标签: python python-3.x data-structures linked-list


    【解决方案1】:

    current.next=None 应该在 while 循环之外:

    def delete (self): #want to delete last cell
        if self.top == None:
            return None
        self.length -=1
        current = self.top
        nextcell = self.top.next
        while (nextcell != None):
            if nextcell == self.last:
                current = self.last
                break
            current = current.next
            nextcell = nextcell.next
        # current.next should be run only after finding the last element
        # so place it outside the loop
        current.next= None
    

    【讨论】:

    • 如果我想删除的不是最后一个单元格,而是有值的单元格怎么办?例如 numbers.delete(40),我想删除值为 40 的单元格
    【解决方案2】:

    我不确定你的 while 循环在做什么,如果你想删除最后一个元素,你会这样做:

    1. 处理空列表情况(什么都不做)
    2. 处理 1 元素列表案例(删除整个列表)
    3. 查找倒数第二个元素,将其设置为无,最后指向该元素:

      def delete (self): #want to delete last cell
          if self.top is None:
              return None
          if self.top == self.last:
              self.top, self.last = None, None
              self.length = 0
              return
          self.length -= 1        
          current = self.top
          while current.next != self.last:
              current = current.next
          current.next = None
          self.last = current
      

    删除一个有值的单元格。

    1. 检查空列表
    2. 遍历列表,跟踪前任,直到元素 被发现。
    3. 如果没有找到,什么也不做。
    4. 如果用户正在删除链表的头部,重置顶部
    5. 找到后,将前任的下一个指向找到的下一个。

    这是该算法的一个示例:

    def delete_value(self, value):
        if self.top == null: # empty list
            return
        predecessor, current = None, self.top
        while current.value != value:
            predecessor = current
            current = current.next
        if current is None: # not found, nothing to do:
            return
        self.length -= 1
        if predecessor is None: # self.top == current, we are deleting the head of the linked list
            self.top = self.top.next
        else:
            predecessor.next = current.next
    

    【讨论】:

    • 如果我想删除的不是最后一个单元格,而是有值的单元格怎么办?例如 numbers.delete(40),我想删除值为 40 的单元格
    猜你喜欢
    • 2014-03-01
    • 2022-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 2021-08-16
    相关资源
    最近更新 更多