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

时间:2016-09-21 06:46:30

标签: python-2.7 singly-linked-list

我确实看到了这篇帖子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.nexttargetNode对象。

2 个答案:

答案 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.valuetargetNode进行比较。请注意,这将在第一次出现目标值之前插入值。因此,您可能希望将列表转换为集合。

答案 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在他的评论中指出的那样,上述解决方案仅在节点列表中没有重复项时才有效。