📅  最后修改于: 2023-12-03 15:40:01.755000             🧑  作者: Mango
双向链表是一种常见的数据结构,由多个节点组成,每个节点包括值和指向前一个节点和后一个节点的指针。双向链表相比单向链表,可以双向遍历,方便实现某些功能。
下面是一个包含n个节点的双向链表的示例,并以反序打印为例。假设我们已经定义了节点类Node
,包含属性val
和指向前后节点的属性prev
和next
,并已经创建好了双向链表head
。
class Node:
def __init__(self, val=0, prev=None, next=None):
self.val = val
self.prev = prev
self.next = next
head = Node(1)
node2 = Node(2, head)
head.next = node2
node3 = Node(3, node2)
node2.next = node3
node4 = Node(4, node3)
node3.next = node4
node5 = Node(5, node4)
node4.next = node5
现在我们要实现反转打印,也就是从最后一个节点开始打印,一直到第一个节点。可以通过遍历链表,将节点的值加到列表中,并将列表反序。这里我们使用一个辅助函数reverse_print
来实现反转。
def reverse_print(head):
res = []
p = head
while p:
res.append(p.val)
p = p.next
return res[::-1]
print(reverse_print(head)) # 输出 [5, 4, 3, 2, 1]
另一种实现方式是使用递归,从最后一个节点开始递归。这里我们使用一个辅助函数reverse_print_recursion
来实现递归。
def reverse_print_recursion(head):
if not head:
return []
res = reverse_print_recursion(head.next)
res.append(head.val)
return res
print(reverse_print_recursion(head)) # 输出 [5, 4, 3, 2, 1]
以上两种方法的时间复杂度都是O(n),空间复杂度分别是O(n)和O(n)。具体实现可以根据实际情况选择。