Python 2.7 在Python中的单链表中,在另一个节点之前插入一个节点?
我确实看到了这篇文章[java],并且正在尝试类似的解决方案,但注意到的线程没有完全回答我的问题) 我需要处理单链接列表,并希望尝试执行insertBefore()方法。我知道双链表有一个previous属性,而单链表没有,所以我知道使用双链表可以更好地实现这一点,但这是作业的要求,我正在尝试解决问题 到目前为止,我已经在SingleLinkedList类中设置了节点类。我还得到了insertBefore()方法,这是我的目标,也是我陷入困境的地方 您将在我的if语句中看到,我希望将Python 2.7 在Python中的单链表中,在另一个节点之前插入一个节点?,python-2.7,singly-linked-list,Python 2.7,Singly Linked List,我确实看到了这篇文章[java],并且正在尝试类似的解决方案,但注意到的线程没有完全回答我的问题) 我需要处理单链接列表,并希望尝试执行insertBefore()方法。我知道双链表有一个previous属性,而单链表没有,所以我知道使用双链表可以更好地实现这一点,但这是作业的要求,我正在尝试解决问题 到目前为止,我已经在SingleLinkedList类中设置了节点类。我还得到了insertBefore()方法,这是我的目标,也是我陷入困境的地方 您将在我的if语句中看到,我希望将node.n
node.next.value
与我的targetNode
(注意targetNode是一个值)——为什么我的node.next.value会抛出以下错误<代码>如果node.next.value==targetNode:AttributeError:'NoneType'对象没有属性'value'
# this is our node object
class Node(object):
def __init__(self, value, next=None):
self.value = value
self.next = next
# this is our singly linked list object
class SinglyLinkedList(object):
def __init__(self):
self.head = None
self.tail = None
def insertBefore(self, targetNode, value):
# create new node
newNode = Node(value)
# find target node to insert
node = self.head
if node == None:
print 'There aren\'t any nodes to insert before!'
else:
found = None
# search nodes
while node:
if node.next.value == targetNode:
found = True
print node.value + ' <--this was node before target'
beforeInsert = node
afterInsert = node.next
beforeInsert.next = newNode
newNode.next = afterInsert # sets new node's next to target node
node = node.next # continues through while loop
else:
node = node.next
if found != True:
print 'Your target node of {} was not found in the list!'.format(targetNode)
#这是我们的节点对象
类节点(对象):
def uuu init uuuu(self,value,next=None):
自我价值=价值
self.next=下一个
#这是我们的单链表对象
类SinglyLinkedList(对象):
定义初始化(自):
self.head=无
self.tail=None
def insertBefore(自身、目标节点、值):
#创建新节点
newNode=节点(值)
#查找要插入的目标节点
node=self.head
如果节点==无:
打印“之前没有任何要插入的节点!”
其他:
找到=无
#搜索节点
while节点:
如果node.next.value==targetNode:
找到=真
print node.value+'正如您所建议的,问题似乎是您使用目标节点创建了一个新节点,node.next==node(targetNode)
,因为这永远不会是真的
我假设targetNode是一个节点对象,在这种情况下,您只需使用Node.next==targetNode
代码的另一个问题是没有检查第一个节点是否是目标节点。因此,您将无法使用insertBefore
功能在头部node
之前插入节点
以下代码是对insertBefore
函数的重写,该函数在给定节点之前插入具有指定值的新节点
def insertBefore(self, targetValue, value):
# create new node
newNode = Node(value)
# find target node to insert
node = self.head
if node == None:
print 'There aren\'t any nodes to insert before!'
else:
# search nodes
if node.value == targetValue:
newNode.next = self.head
self.head = newNode
while node.next is not None:
if node.next.value == targetValue:
print ">>> ",node.value,' <--this was node before target'
newNode.next = node.next
node.next = newNode
return
else:
node = node.next
print 'Your target node of {} was not found in the list!'.format(targetNode.value)
def insertBefore(self、targetValue、value):
#创建新节点
newNode=节点(值)
#查找要插入的目标节点
node=self.head
如果节点==无:
打印“之前没有任何要插入的节点!”
其他:
#搜索节点
如果node.value==targetValue:
newNode.next=self.head
self.head=newNode
而node.next不是None:
如果node.next.value==targetValue:
打印“>>>”,node.value,“以下是我如何找到问题的解决方案:
def insertBefore(self, targetValue, value):
# create new node
newNode = Node(value)
# find target node to insert
node = self.head
if node == None:
print 'There aren\'t any nodes to insert before!'
else:
found = False
# search nodes
while node:
if node.next == None:
break
if node.next.value == targetValue:
found = True
newNode.next = node.next
node.next = newNode
break
else:
node = node.next
if found != True:
print 'Your target node of {} was not found in the list!'.format(targetValue)
请注意,正如Jonas在其评论中指出的,只有在节点列表中没有重复项时,上述解决方案才有效 实际上,我尝试了node.next.value==targetNode
(targetNode是一个值而不是一个对象),但这对我不起作用,因为我得到了一个错误,即node.next.value
没有定义(这对我来说很奇怪…),我知道node.next
和node.value
是有效的,但是由于某种原因,node.next.value
抛出了一个错误…我知道我离得很近,我很想知道为什么它不起作用:)我也有同样的想法,但是你的回答给了我以下错误:if node.next.value==targetNode:AttributeError:'NoneType'对象没有属性'value'
你能告诉我你是怎么做的吗调用你的函数?如果targetNode
是一个值而不是一个节点,则您的命名有点不清楚。另外,如果您将值作为插入之前的目标值,那么您将只能在该值首次出现在列表中之前插入。我添加了下面能够找到的解决方案,我调用了我的insertBefore()函数,如下所示:names=SinglyLinkedList()
names.insertBefore('Tim','John')
(这适用于我希望在节点“Tim”之前插入“John”的链接列表。)targetNode
是一个值,也许targetValue更合适。好的,我现在更新了代码,以便它使用节点的值而不是实际节点。您的解决方案仍然存在一个问题,即它没有检查列表的头是否是目标节点,因此您无法在t的开头插入节点再次,我想说的是,insertBefore
只有在你的列表不包含任何重复项的情况下才能得到很好的定义。为什么有人投票反对我提出这个问题?我上面的问题有什么问题,为什么我不能问这样的问题?