所以我一直在尝试将一个项目插入到链接列表的前面,这有点起作用,但并不完全。这是我到目前为止(LinkedList类中有更多方法,但我省略了它们,因为它们不是问题):
class _Node():
def __init__(self, data=None, link=None):
self.data = data
self.link = link
class LinkedList():
def __init__(self):
self.first = None
self.size = 0
def insert(self, ind, item):
if self.first is None:
self.first = _Node(item)
elif ind == 0: # this is where the problem is. When I try to
temp = self.first # insert a node to the front, it seems to
temp.link = self.first.link # forget about the rest of the nodes.
self.first = _Node(item)
self.first.link = temp
else:
count = 0
while count != ind - 1:
count += 1
self.first = self.first.link
self.first.link = _Node(item, self.first.link)
self.size += 1
说我在shell中有这个:
>>> L = LinkedList()
>>> L.insert(0, 5)
>>> L.insert(1, 10)
>>> L.insert(0, 20)
>>> L[0]
20
>>> L[1]
5
>>> L[2]
# and here is an error message, it says NoneType object has no attribute 'data'
所以在上面的代码中,我尝试做的是创建一个与第一个节点对象相同的临时节点对象,我将该临时节点链接到第一个节点链接,我创建了新节点,我将新节点链接到临时节点,但这不起作用。 任何帮助都会很棒,谢谢!
答案 0 :(得分:2)
似乎那些你因为“不是问题”而遗漏的功能可能实际上是你的问题......
如果您以这种方式询问每个节点中的数据,您的代码就会起作用:
>>> L = LinkedList()
>>> L.insert(0,5)
>>> L.insert(1,10)
>>> L.insert(0,20)
>>> print L.first.data
20
>>> print L.first.link.data
5
>>> print L.first.link.link.data
10
您可能遇到定义__getitem__
的问题。此外,您评论的部分可以在一行中重写,这可能更像Pythonic。
temp = self.first
temp.link = self.first.link
self.first = _Node(item)
self.first.link = temp
前两行不执行任何操作,因为temp
为self.first
所以您所说的只是self.first.link = self.first.link
。接下来的两个可写:
self.first = _Node(item, self.first)
答案 1 :(得分:0)
首先,请注意,您实际上不需要特殊情况下的空列表:
def insert(self, ind, item):
if ind == 0:
newnode = _Node(item, self.first)
self.first = newnode
其次,这不是问题。这段代码:
else:
count = 0
while count != ind - 1:
count += 1
self.first = self.first.link
self.first.link = _Node(item, self.first.link)
self.size += 1
更改 self.first,因此忘记之前的第一个节点。解决这个问题的最小变化是:
else:
count = 0
insert_point = self.first # use a local variable to walk the list
while count != ind - 1:
count += 1
insert_point = insert_point.link
insert_point.link = _Node(item, insert_point.link)
self.size += 1