当前位置: 首页 > 知识库问答 >
问题:

是否将项目插入链接列表得前面?巨蟒

樊浩初
2023-03-14

所以我一直尝试在链表前面插入一个项目,它有点起作用,但不完全起作用。下面是我到目前为止拥有的(LinkedList类中还有更多的方法,但我省略了它们,因为它们不是问题):

class _Node():
    def __init__(self, data=None, link=None):
        self.data = data
        self.link = link

class LinkedList():
    def __init__(self):
        self.first = None
        self.size = 0

    def insert(self, ind, item):
        if self.first is None:
            self.first = _Node(item)
        elif ind == 0:                   # this is where the problem is. When I try to 
            temp = self.first            # insert a node to the front, it seems to
            temp.link = self.first.link  # forget about the rest of the nodes.
            self.first = _Node(item)
            self.first.link = temp  
        else:
            count = 0
            while count != ind - 1:
                count += 1
                self.first = self.first.link
            self.first.link = _Node(item, self.first.link)
        self.size += 1

假设我有这个外壳:

    >>> L = LinkedList()
    >>> L.insert(0, 5)
    >>> L.insert(1, 10)
    >>> L.insert(0, 20)
    >>> L[0]
    20
    >>> L[1]
    5
    >>> L[2]
    # and here is an error message, it says NoneType object has no attribute 'data'

在上面的代码中,我要做的是创建一个与第一个节点对象相同的临时节点对象,我将这个临时节点链接到第一个节点链接,我创建一个新节点,我将这个新节点链接到临时节点,但这不起作用。任何帮助都是很好的,谢谢!

共有2个答案

柴俊捷
2023-03-14

首先,请注意,实际上您不需要在这里对空列表进行特殊处理:

def insert(self, ind, item):
    if ind == 0:
        newnode = _Node(item, self.first)
        self.first = newnode

其次,这不是问题所在。此代码

    else:
        count = 0
        while count != ind - 1:
            count += 1
            self.first = self.first.link
        self.first.link = _Node(item, self.first.link)
    self.size += 1

改变self.first的位置,因此它忘记了第一个节点之前是什么。解决此问题的最小改动是:

    else:
        count = 0
        insert_point = self.first # use a local variable to walk the list
        while count != ind - 1:
            count += 1
            insert_point = insert_point.link
        insert_point.link = _Node(item, insert_point.link)
    self.size += 1
百里渊
2023-03-14

看起来,那些你因为“不是问题所在”而忽略掉的功能,实际上可能是你的问题。

如果您以以下方式请求每个节点中的数据,那么您的代码可以正常工作:

>>> L = LinkedList()
>>> L.insert(0,5)
>>> L.insert(1,10)
>>> L.insert(0,20)
>>> print L.first.data
20
>>> print L.first.link.data
5
>>> print L.first.link.link.data
10

您在定义__getitem__时可能有问题。此外,您所评论的部分可以在一行中重写,这可能更加Pythonic。

temp = self.first
temp.link = self.first.link
self.first = _Node(item)
self.first.link = temp

前两行不起作用,因为tempself.first所以您要说的是self.first.link=self.first.link。接下来的两个可以写:

self.first = _Node(item, self.first)
 类似资料:
  • 我正在尝试为一个项目创建一个双链接列表容器。我不能使用任何std容器。必须对双链接列表进行排序。以下是我目前的代码: 我遇到的问题是在我的插入函数中。我正在使用调试器,并在以下行插入代码:list.insert(10);。 它正确地进入第一种情况,即head==nullptr并创建节点。当我进入下一行代码(list.insert(20))时,它会用这一行创建一个节点:node*node=newno

  • 我有以下代码,它是双链表实现的一部分。然后,我必须使用我的ADT实现来创建一个表,其格式为(它是一个字符串)、(它是uint32_t类型)(因此是一个2列的表)。 我需要首先创建这个表,然后添加到这个记录。 我的困难在于实现一个函数,该函数将要添加的值插入到这个特定的表中。我需要另一个插入功能,还是必须编辑我拥有的功能? 如果需要一个新的函数作为参数:一个指向结构类型的新表>代码> ListSt目

  • 我正在尝试创建一个函数,用于在双链接列表的末尾添加。我无法精确指出为什么它没有打印出任何内容。 当我构建程序时,没有出现错误。 我正在确定。新建节点首先检查头部是否有任何值 在上一个当前指针之后创建 我将前一个节点连接到新节点,新节点指向前一个节点,而新节点指向nullptr作为下一个节点。

  • insertUrl(int $row, int $column, string $url[, string $text, string $toolTip, resource $formatHandler]) int $row $excel = new \Vtiful\Kernel\Excel($config); ​ $urlFile = $excel->fileName("free.xlsx")

  • 问题内容: 是的,我知道元组是不可变的,但是这种情况使得我需要在每个元组中插入一个额外的值。因此,其中一项是金额,我需要在其旁边添加其他货币的新项目,如下所示: 可能? 谢谢! 问题答案: 您可以将其转换为列表,插入项目,然后将其转换回元组。

  • 该方法不起作用: 另一种有效的添加方法: 要调试的打印方法: DoublyLinkedList类: LinkedList和Node的实现非常简单,https://www.geeksforgeeks.org/doubly-linked-list/ 我首先创建一个link列表,insert_front()一个值来使头不为空,然后使用上面的方法插入其他东西。插入节点后的前端、结尾,但是,这个insert