Python LinkedList删除方法不起作用

Python LinkedList删除方法不起作用,python,Python,这是我的节点: class Node(object): def __init__(self, data, next = None): self.data = data self.next_node = next def get_next(self): return self.next_node def set_next(self, next): self.next_node = next def get_dat

这是我的节点:

class Node(object):
    def __init__(self, data, next = None):
      self.data = data
      self.next_node = next

    def get_next(self):
      return self.next_node

    def set_next(self, next):
      self.next_node = next

    def get_data(self):
      return self.data

    def set_data(self):
      self.data = data
这是LinkedList本身:

class LinkedList(object):
    def __init__(self, root = None):
      self.root = root
      self.size = 0

    def size(self):
      return self.size

    def insert(self, data):
      new_node = Node (data, self.root)
      self.root = new_node
      self.size += 1

    def delete(self, data):
      this_node = self.root
      prev_node = None
      while this_node:
        if this_node.get_data() == data:
          if prev_node:
            prev_node.set_next(this_node.get_next())
          else:
            self.root = this_node
          self.size -= 1
          return True
        else:
          prev_node = this_node
          this_node = this_node.get_next()
      return False

    def search(self, data):
      this_node = self.root
      while this_node:
        if this_node.get_data() == data:
          return data
        else:
          self.root = this_node.get_next()
        return None

    def printLL(self):
      this_node = self.root
      while this_node:
        print(this_node.data)
        this_node  = this_node.get_next()
最后,我将执行以下测试:

ll = LinkedList()
ll.insert(1)
ll.insert(2)
ll.printLL()
ll.delete(2)
ll.printLL()
if ll.search(2):
    print("Value 2 found")
else:
    print("Value 2 not found")
if ll.search(1):
    print("Value 1 found")
else:
    print("Value 1 not found")
ll.insert(4)
ll.printLL()
print(str(ll.size))
我目前得到以下输出:

2
1
2
1
Value 2 found
Value 1 not found
4
1
2
但我应该得到这个输出:

2 1
1
Value 2 not found
Value 1 found
4 1
2
2 1
1
Value 2 not found
Value 1 found
4 1
2

应删除2,并且LinkedList应全部显示在一行上。知道为什么删除功能不起作用吗?另外,如何正确设置格式?

您删除时的错误如下:

if prev_node:
  prev_node.set_next(this_node.get_next())
else:
  self.root = this_node
对于值为
2
的节点,没有
prev_节点
(它位于链接的开头),因此可以将节点本身指定给
self.root
。您应该指定下一个节点:

  self.root = this_node.get_next()
接下来,您的搜索代码修改您的链接列表;它将第一个节点分配给self.root,然后在第一个节点上找不到匹配项时总是立即返回
None

while this_node:
  if this_node.get_data() == data:
    return data
  else:
    self.root = this_node.get_next()
  return None
不要那样做!您希望替换
此\u节点
,并且仅在
while
循环完成后返回
None

while this_node:
  if this_node.get_data() == data:
    return data
  else:
    this_node = this_node.get_next()
return None
至于印刷方面,;您正在对每个节点使用
print()
调用,因此请告诉它在节点之间放置空格,或者在打印之前将所有节点值收集到一个列表中:

def printLL(self):
  this_node = self.root
  first = False
  while this_node:
    print(' ' if not first else '', this_node.data, sep='', end='')
    first = False
    this_node  = this_node.get_next()
  print()

注意,给出
节点
getter和setter没有什么意义;只需直接访问
next
data
属性,就像您在某些地方所做的那样

随着这些变化,输出变为:


您的删除错误如下:

if prev_node:
  prev_node.set_next(this_node.get_next())
else:
  self.root = this_node
对于值为
2
的节点,没有
prev_节点
(它位于链接的开头),因此可以将节点本身指定给
self.root
。您应该指定下一个节点:

  self.root = this_node.get_next()
接下来,您的搜索代码修改您的链接列表;它将第一个节点分配给self.root,然后在第一个节点上找不到匹配项时总是立即返回
None

while this_node:
  if this_node.get_data() == data:
    return data
  else:
    self.root = this_node.get_next()
  return None
不要那样做!您希望替换
此\u节点
,并且仅在
while
循环完成后返回
None

while this_node:
  if this_node.get_data() == data:
    return data
  else:
    this_node = this_node.get_next()
return None
至于印刷方面,;您正在对每个节点使用
print()
调用,因此请告诉它在节点之间放置空格,或者在打印之前将所有节点值收集到一个列表中:

def printLL(self):
  this_node = self.root
  first = False
  while this_node:
    print(' ' if not first else '', this_node.data, sep='', end='')
    first = False
    this_node  = this_node.get_next()
  print()

注意,给出
节点
getter和setter没有什么意义;只需直接访问
next
data
属性,就像您在某些地方所做的那样

随着这些变化,输出变为: