Python 3.x 带2个指针的Python LinkedList
我正在尝试使用迭代方法实现linkedlist。我有两个指针(头,尾)。因此,无论如何都要避免使用没有递归的2个指针。对于printList函数,最好只使用头指针。对于您当前的链表实现,Python 3.x 带2个指针的Python LinkedList,python-3.x,data-structures,linked-list,singly-linked-list,Python 3.x,Data Structures,Linked List,Singly Linked List,我正在尝试使用迭代方法实现linkedlist。我有两个指针(头,尾)。因此,无论如何都要避免使用没有递归的2个指针。对于printList函数,最好只使用头指针。对于您当前的链表实现,self.tail除了在末尾加快插入速度之外,其他任何用途都没有。您可以像在printList()。请记住,虽然这确实避免了递归,但它本质上强制所有操作都是O(n);不过这并不坏,因为这是典型的简单链表 使尾部指针和节点引用以前的节点的目的是使您也可以支持反向遍历。这是一个简单的优化,但改进只会变成O(n/2):
self.tail
除了在末尾加快插入速度之外,其他任何用途都没有。您可以像在printList()。请记住,虽然这确实避免了递归,但它本质上强制所有操作都是O(n);不过这并不坏,因为这是典型的简单链表
使尾部指针和节点引用以前的节点的目的是使您也可以支持反向遍历。这是一个简单的优化,但改进只会变成O(n/2):对于短列表来说足够好,但对于较大的列表来说毫无意义。同样,这也是在矢量化、有序和树状数据结构上使用这种结构的学习点。首先,我发现您的printList()
方法有一个问题:您正在对打印的每个节点重新分配self.head
。最终在打印后,您将丢失链接的每个节点,因为最后一个节点(self.head.next
)将是None
。欢迎使用stackoverflow。除了您提供的答案,请考虑提供一个简要解释为什么以及如何修复这个问题。
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()
def getList(self):
data = []
currentNode = self.head
while currentNode is not None:
data.append( currentNode.data )
currentNode = currentNode.next
return data