【问题标题】:Return value fail返回值失败
【发布时间】:2018-03-17 23:42:40
【问题描述】:

我正在处理一个双向链表,但我无法返回从列表中间删除一个项目的值。我不太确定为什么,并且会很感激第二双眼睛看透这一点。

如果我附加三个数字,然后删除索引1, 处的数字,它应该返回索引1 处的值。

class Linked_List:

    class __Node:

      def __init__(self, val):
          self.val = val
          self.next = None
          self.prev = None
          return


  def __init__(self):
    self.__header = self.__Node(None)
    self.__trailer = self.__Node(None)
    self.__header.next = self.__trailer
    self.__trailer.prev = self.__header
    self.__size = 0


  def __len__(self):
    return self.__size


  def remove_element_at(self, index):
    if index > self.__size or index < 0 or index == self.__size:
       raise IndexError
    cur = self.__header.next
    element_to_return = cur
    if index == 0:
       self.__header.next = self.__header.next.next
    else:
       for i in range(0, index):
          cur = cur.next
       element_to_return = cur.val
       cur.next = cur.next.next
    self.__size -= 1
    return str(element_to_return.val)

【问题讨论】:

  • if not (0 &lt;= index &lt; self.__size): - 也 - 请显示链表结构,什么是 self.__header.next f.e.或者什么是 self.__header.next.next。 DLL 通常有一个 prev(可能是 None)和一个 Next(可能是 None)——在 X 处删除通常是从 head 开始,然后向下直到 X 到达,然后修改 prev 指向 next,返回 curr.Value。完成

标签: python-3.x return-value doubly-linked-list


【解决方案1】:

我添加了addValue()debug() 方法(提示:阅读How to debug small programs (#1))。

为了清晰起见,我修改了开始/结束节点以具有值。我减少/重组(重写)了您的 remove 方法 - 它有一些不需要的开销和指针错误。对于双链表,您必须同时处理后面和前面的元素,并正确更改所有指针以保持链的完整性。

class Linked_List: 
    class __Node: 
      def __init__(self, val):
          self.val = val
          self.next = None
          self.prev = None
          return 


    def __init__(self):
      self.__header = self.__Node('Start')   # start node
      self.__trailer = self.__Node('End')    # end node
      self.__header.next = self.__trailer 
      self.__trailer.prev = self.__header
      self.__size = 0


    def debug(self):
        cur = self.__header 
        print("prev.val  cur.val  next.val")
        i = 0
        while cur:
            print("  " * i, f'{cur.prev.val if cur.prev else None}  {cur.val}  {cur.next.val if cur.next else None}')
            i+=1
            cur = cur.next


    def addValue(self, val):
        """Adds the str of val at the end."""
        n = self.__Node(str(val))
        n.next = self.__trailer   
        n.prev = self.__trailer.prev
        self.__trailer.prev.next = n
        self.__trailer.prev = n
        self.__size += 1


    def remove_element_at(self, index):
        if not (0 <= index < self.__size ): # simplified
            # better message on error
            raise IndexError (f'Index {index} out of bounds [0,{self.__size-1}]')

        cur = self.__header.next     # simplified, element_to_return not needed

        # there is no need for special cases for 0 or size - this will handle all
        for i in range(0, index):
            cur = cur.next   # go ever deeper, if we are at 0 or self.__size not entering
        cur.prev.next = cur.next  # repointer prev's next to our next
        cur.next.prev = cur.prev  # repointer next's prev to our prev
        self.__size -= 1          # decrease size
        return str(cur.val)       # return our value


k = Linked_List()

for n in range(5):
    k.addValue(n)
k.debug()
removed = k.remove_element_at(4)
k.debug()
print(f'removed: {removed}')

输出:

prev.val  cur.val  next.val
 None  Start  0
   Start  0  1
     0  1  2
       1  2  3
         2  3  4
           3  4  End
             4  End  None
 None  Start  0
   Start  0  1
     0  1  2
       1  2  3
         2  3  End
           3  End  None
removed: 4

编辑:

我的 add 方法是自建。确保您的指针正确获取 - 使用调试方法确保 cur.prev.next 指向 curcur.next.prev 也是 cur

【讨论】:

    猜你喜欢
    • 2017-10-30
    • 2018-12-08
    • 2015-09-26
    • 1970-01-01
    • 1970-01-01
    • 2018-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多