带有2个指针的Python LinkedList

时间:2018-10-15 23:05:28

标签: python-3.x data-structures linked-list singly-linked-list

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

class LinkedList:
    def __init__(self):
        self.head = None
        self.tail = None

    def insert_node(self, node_data):
        node = Node(node_data)

        if not self.head:
            self.head = node
        else:
            self.tail.next = node


        self.tail = node

# Complete the printLinkedList function below.

    def printList(self):
        while self.head is not None:
            print(self.head.data)
            self.head = self.head.next

l = LinkedList()
l.insert_node(5)
l.insert_node(10)
l.insert_node(19)
l.printList()

我正在尝试使用迭代方法来实现链表。我有2个指针(头,尾)。所以无论如何要避免使用2个指针而不递归。对于printList函数,仅使用头指针是一种好习惯。任何反馈表示赞赏

2 个答案:

答案 0 :(得分:1)

在您当前的链表实现中,self.tail除了结束最后插入之外,实际上并没有其他目的。您可以像在printList()方法中那样,通过从头指针迭代所有“链表”操作来删除它。请记住,尽管这样做确实避免了递归,但这必然会强制所有操作为O(n);不过,这还不错,因为这是简单化的链表的典型代表。

使用尾指针和节点引用先前节点的目的是为了使您也可以支持反向遍历。这是一个简单的优化,但是改进仅变为O(n / 2):对于短列表来说已经足够好了,但是对于较大的列表却没有意义。再次,这是在矢量化,有序和树状数据结构上使用这种结构的学习重点。

答案 1 :(得分:0)

def getList(self):
    data = []
    currentNode = self.head
    while currentNode is not None:
        data.append( currentNode.data )
        currentNode = currentNode.next
    return data