无法在链接列表的开头插入项目 - python

时间:2017-02-07 17:07:23

标签: python-3.x linked-list

我目前正在学习课程的链接列表并遇到麻烦。 我必须能够在指定项目之前插入项目 梨之前的(苹果,香蕉,梨)(Apple,banana,newItem,pear) 我用这段代码管理了这个:

def insert_before(head,data,location):
    current = head
    found = False

    while not found:
        if current.next.data == location:
            new_node = Node(data)
            new_node.next = current.next
            current.next  = new_node
            found = True
        else:
            current = current.next

但是当我尝试在列表中的第一个项目之前插入一个项目时出现了我的问题,为了尝试这个,我想这样做:

if head.data  == location:
    new_node = Node(data)
    head.next = head.next
    new_node.next = head`

但这似乎不起作用。我在这里找到的任何指南都是在第一项之后添加一个项目,任何提示都会受到赞赏。

1 个答案:

答案 0 :(得分:0)

在提供的源代码中,使用head.next = head.next不执行任何操作,并且不会更改head节点的值。

要通过之前插入新节点来修改链接列表中第一个节点的值,必须更新head变量。

解决方案1 ​​ - 将head指定为insert_before()函数的返回值。

  

变量previous用于在之前和之后修改节点   = None,必须修改第一个节点。

def insert_before(head,data,location):
    current = head
    previous = None
    found = False

    while not found:
        if (current != None):
            if (current.data == location):
                new_node = Node(data)
                if (previous != None):
                    new_node.next = previous.next
                    previous.next  = new_node
                else:
                    new_node.next = head
                    head = new_node
                found = True
            else:
                previous = current
                current = current.next
        else:
            print('location ',location,' not found.')
            break
    return head

该功能的使用变为:

myhead = Node(5)
print(myhead.data) #  >> 5
myhead = insert_before(myhead,3,5)
print(myhead.data) #  >> 3
print(myhead.next.data) #  >> 5

解决方案2 - 通过在head类中添加Node属性来使用Python的OOP。

  

OOP方法非常相似,但不是存储head   在函数外部的节点,函数insert_before()被添加到   班级Node

第1步 - 在课程Node中添加属性head

class Node(object):
    def __init__(self, data=None, next_node=None):
        self.data = data
        self.next = next_node
        self.head = self # store the first node

第2步 - 使用内部self.head代替head作为参数

  

在这种情况下,当新节点插入第一个节点之前   节点,赋值非常简单self.head = new_node

def Insert_Before(self,data,location):
    current = self.head
    previous = None
    found = False
    print('insert ',data,' before ',location)

    while not found:
        if (current != None):
            if (current.data == location):
                new_node = Node(data)
                if (previous != None):
                    new_node.next = previous.next
                    previous.next  = new_node
                else:
                    new_node.next = self.head
                    self.head = new_node # update the first node
                found = True
            else:
                previous = current
                current = current.next
        else:
            print('location ',location,' not found.')
            break
    return

该功能的使用变为:

myhead = Node(5)
print(myhead.data)
myhead.insert_before(3,5)
print(myhead.head.data)
print(myhead.head.next.data)
  

警告:不要使用myhead作为第一个节点,而是使用   myhead.head属性。