Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 在Python中的单链表中,在另一个节点之前插入一个节点?_Python 2.7_Singly Linked List - Fatal编程技术网

Python 2.7 在Python中的单链表中,在另一个节点之前插入一个节点?

Python 2.7 在Python中的单链表中,在另一个节点之前插入一个节点?,python-2.7,singly-linked-list,Python 2.7,Singly Linked List,我确实看到了这篇文章[java],并且正在尝试类似的解决方案,但注意到的线程没有完全回答我的问题) 我需要处理单链接列表,并希望尝试执行insertBefore()方法。我知道双链表有一个previous属性,而单链表没有,所以我知道使用双链表可以更好地实现这一点,但这是作业的要求,我正在尝试解决问题 到目前为止,我已经在SingleLinkedList类中设置了节点类。我还得到了insertBefore()方法,这是我的目标,也是我陷入困境的地方 您将在我的if语句中看到,我希望将node.n

我确实看到了这篇文章[java],并且正在尝试类似的解决方案,但注意到的线程没有完全回答我的问题)

我需要处理单链接列表,并希望尝试执行insertBefore()方法。我知道双链表有一个previous属性,而单链表没有,所以我知道使用双链表可以更好地实现这一点,但这是作业的要求,我正在尝试解决问题

到目前为止,我已经在SingleLinkedList类中设置了节点类。我还得到了insertBefore()方法,这是我的目标,也是我陷入困境的地方

您将在我的if语句中看到,我希望将
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
只有在你的列表不包含任何重复项的情况下才能得到很好的定义。为什么有人投票反对我提出这个问题?我上面的问题有什么问题,为什么我不能问这样的问题?