如何克隆链表?

时间:2017-02-05 09:04:19

标签: 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_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 [] - > [] - > [] - >无(这是上述一个的克隆)

2 个答案:

答案 0 :(得分:0)

首先,您的列表不是最理想的。实现链表时,您应该:

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

答案 1 :(得分:0)

克隆链表的最基本方法是逐个遍历列表,然后创建一个新的链表,像往常一样在尾部插入新元素。创建LL类的新实例,然后使用insert_tail()方法添加要克隆的列表中的项目。

如果您希望克隆data属性以使克隆列表不与原始列表进行交互,那么您将不得不在Python中使用深层复制。

https://docs.python.org/2/library/copy.html

值得注意的是,在整个链表上使用深层拷贝可能更简单,但是,您的里程可能会因您想要完成的内容而有所不同。