Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.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 如何克隆链接列表?_Python_Data Structures_Linked List - Fatal编程技术网

Python 如何克隆链接列表?

Python 如何克隆链接列表?,python,data-structures,linked-list,Python,Data Structures,Linked List,下面是一个链表的基本示例,如下所示 头部->[4]->[6]->[8]->无 class Node: def __init__(self, data, next = None): self.data = data self.next = next class LL: def __init__(self): self.head = None def insert_tail(self, o): new_n

下面是一个链表的基本示例,如下所示

头部->[4]->[6]->[8]->无

class Node:

    def __init__(self, data, next = None):
        self.data = data
        self.next = next

class LL:

    def __init__(self):
        self.head = None

    def insert_tail(self, o):
        new_node = Node(o)
        if self.head == None:
            self.head = new_node
        else:
            current = self.head
            while current.next != None:
                current = current.next
            current.next = new_node

    def __str__(self):
        result = ''
        current = self.head
        while current != None:
            result = result + str(current.data) + ", "
            current = current.next
        return result[:-2]




    def clone(self, empty):
        '''(LL, NoneType) -> LL
        '''
        empty = LL()
        current = self.head 
        while current != None:
            empty.insert_tail(None)
            current = current.next
        return empty

a = LL()
a.insert_tail(4)
a.insert_tail(6)
a.insert_tail(8)
print(a)
我的问题是,我如何在不改变原始链表的情况下克隆它?哦,我不想使用任何内置的数据结构来实现这一点,因为没有列表、字典、元组等(也没有导入)

编辑:我不想克隆数据,我只想要一个链接列表,如:


head[]->[]->[]->[]->None(这是上面一个的克隆)

首先,您的列表不太理想。实施链表时,您应该:

  • 在列表的开头插入项目什么是
    O(1)
  • 如果您想支持在列表末尾插入项目,您还应该跟踪列表的最后一个元素(因此插入也将是
    O(1)
    ,在您的示例中是
    O(n)
  • 要解决您的问题,您可以采取以下方法:
    创建一个空列表并遍历现有列表。对于现有列表中的每个元素,只需将其添加到新列表的末尾即可。

    克隆链接列表的最基本方法是逐项遍历列表,并在运行时创建一个新的链接列表,在尾部插入新元素,就像通常一样。创建
    LL
    类的新实例,然后使用
    insert\u tail()
    方法从要克隆的列表中添加项目

    如果希望克隆
    数据
    属性,以便克隆的列表不会与原始列表交互,那么必须在Python中采用深度复制


    值得注意的是,在整个链接列表中使用深度副本可能会更简单,但是,根据您试图完成的任务,您的里程可能会有所不同。

    真不敢相信我忘记了python作为标记,Whoopsie作为旁注,您真的应该将类命名为
    LinkedList
    或更具描述性的名称。@NPE我的克隆方法就是我管理的方法。设备应该保存在注释中。OP并没有问如何优化它们的实现。我还没有启动算法,所以我不知道你所说的O(1)是什么意思。@Ali89 O(1)表示该操作独立于列表的长度(时间常数)。请注意,在您的示例中,若列表中有N个项目,则添加新项目需要遍历整个列表。这意味着这个操作在时间上是O(N)->它需要的时间与列表的长度成正比。我只是想复制指针,我不在乎数据中有什么。我不知道他们不能互换,我做了一个编辑。@Ali89我已经给出了答案;遍历列表,通过在尾部附加相同的方法创建一个新列表。你不想复制指针,你想创建新的指针;复制的指针将指向旧的链表元素。您好。如果您在“编辑”中查看我的新链接列表,请使用我的克隆方法。正确吗?不,使用类中已有的方法。创建一个新的
    LL
    实例和
    insert_tail()
    目标列表中您试图克隆的所有项目。您好。你是说像那样吗?