返回
反转单向链表的三种方法
前端
2024-02-16 23:05:56
引言
单向链表是一种常见的线性数据结构,它由一系列节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针.反转单向链表是指将链表中节点的顺序从头到尾反转,使原来链表的尾节点变成头节点,原来链表的头节点变成尾节点.
反转单向链表的三种方法
反转单向链表有三种常见的方法:递归法,迭代法和双指针法.
递归法
递归法是将链表分为两个部分:头节点和剩余部分.然后,递归地反转剩余部分,并将反转后的剩余部分连接到头节点的后面.最后,将头节点的指针指向null,即可完成链表的反转.
递归法的实现代码如下:
def reverse_list_recursively(head):
if head is None or head.next is None:
return head
p = reverse_list_recursively(head.next)
head.next.next = head
head.next = None
return p
迭代法
迭代法是使用一个循环来反转链表.在循环中,将当前节点的指针指向前面一个节点,然后将当前节点移动到下一个节点.循环结束后,链表就反转了.
迭代法的实现代码如下:
def reverse_list_iteratively(head):
pre = None
cur = head
while cur is not None:
p = cur.next
cur.next = pre
pre = cur
cur = p
return pre
双指针法
双指针法是使用两个指针来反转链表.一个指针指向当前节点,另一个指针指向当前节点的前一个节点.然后,将当前节点的指针指向前面一个节点,并将前面一个节点的指针指向当前节点.循环结束后,链表就反转了.
双指针法的实现代码如下:
def reverse_list_with_two_pointers(head):
pre = None
cur = head
while cur is not None:
p = cur.next
cur.next = pre
pre = cur
cur = p
return pre
时间复杂度和空间复杂度分析
这三种反转链表的方法的时间复杂度都是O(n),其中n是链表的长度.空间复杂度都是O(1),因为这三种方法都不需要额外的空间.
总结
本文介绍了反转单向链表的三种方法:递归法,迭代法和双指针法.这三种方法的时间复杂度都是O(n),空间复杂度都是O(1).您可以根据自己的需要选择合适的方法来反转链表.