我确实看到了这篇帖子here [java]并尝试了类似的解决方案,但是提到的帖子没有完全回答我的问题)
我需要使用单链表并希望尝试执行insertBefore()方法。我知道双链表有一个先前的属性,而单链表没有,所以我理解使用双链表可能会更好,但这是作业的要求,我试图解决问题。
到目前为止:我已经将我的Node类设置为我的SinglyLinkedList类。我也有了insertBefore()方法,这是我的目标,也是我遇到的问题。
你会在我的if语句中看到,我希望将node.next.value
与我的targetNode
进行比较(请注意,targetNode是一个值) - 为什么我的node.next.value会抛弃我以下错误? if node.next.value == targetNode: AttributeError: 'NoneType' object has no attribute '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)
请注意:我能够将其用于insertAfter()方法(不包含在上面的代码段中),但我很难将node.next
与targetNode
对象。
答案 0 :(得分:0)
正如您自己建议的那样,问题似乎是您使用目标节点node.next == Node(targetNode)
创建一个新节点,因为这永远不会成立。
我假设targetNode是一个Node对象,在这种情况下你应该只使用node.next == targetNode
。
您的代码的另一个问题是您不检查第一个节点是否是目标节点。因此,您将无法使用Node
函数在头insertBefore
之前插入节点。
以下代码重写了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)
如果您希望targetNode
成为目标节点的值,则需要将node.next.value
与targetNode
进行比较。请注意,这将在第一次出现目标值之前插入值。因此,您可能希望将列表转换为集合。
答案 1 :(得分:0)
以下是我能够找到问题解决方案的方法:
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在他的评论中指出的那样,上述解决方案仅在节点列表中没有重复项时才有效。