Python实现单链表翻转的4种常用方法详解
本文详细解析Python中单链表翻转的四种经典方法。包括利用辅助数组逆序重建、使用三个指针原地遍历反转、通过头插法逐个节点插入以及基于递归思想的实现。文章提供完整代码示例,对比各方法的时间复杂度与空间复杂度,帮助开发者根据实际需求选择最优方案。
单链表翻转概述
如何有效地将一个单链表进行反转?
基于数组的逆序反转法
第一种方法是将单链表中的元素存储到数组中,然后按照数组索引的逆序重新构建链表,从而实现反转。
三指针遍历就地反转法
第二种方法涉及使用三个指针遍历单链表,在遍历过程中逐个调整链接点的指向以完成反转。
头插法逐个节点插入
第三种方法从第二个节点开始,依次将后续节点插入到第一个节点(即头节点)之后,最后将原始的第一个节点移动到新链表的末尾。
递归实现链表翻转
第四种方法采用递归策略。虽然大家熟悉用递归处理树结构,但单链表因其自相似的结构特点,同样适用递归思想。可以将单链表视为只有左子树或右子树的特殊树,从而通过递归解决反转问题。
主要涉及的四种实现方式包括:开辟辅助数组、新建表头反转、就地反转以及递归反转。
代码实现与测试
# -*- coding: utf-8 -*-
'''
链表逆序
'''
class ListNode:
def __init__(self,x):
self.val=x
self.next=None
'''
第一种方法:
对于一个长度为n的单链表head,用一个大小为n的数组arr储存从单链表从头
到尾遍历的所有元素,在从arr尾到头读取元素简历一个新的单链表
时间消耗O(n),空间消耗O(n)
'''
def reverse_linkedlist1(head):
if head == None or head.next == None: #边界条件
return head
arr = [] # 空间消耗为n,n为单链表的长度
while head:
arr.append(head.val)
head = head.next
newhead = ListNode(0)
tmp = newhead
for i in arr[::-1]:
tmp.next = ListNode(i)
tmp = tmp.next
return newhead.next
'''
开始以单链表的第一个元素为循环变量cur,并设置2个辅助变量tmp,保存数据;
newhead,新的翻转链表的表头。
时间消耗O(n),空间消耗O(1)
'''
def reverse_linkedlist2(head):
if head == None or head.next == None: #边界条件
return head
cur = head #循环变量
tmp = None #保存数据的临时变量
newhead = None #新的翻转单链表的表头
while cur:
tmp = cur.next
cur.next = newhead
newhead = cur # 更新 新链表的表头
cur = tmp
return newhead
'''
开始以单链表的第二个元素为循环变量,用2个变量循环向后操作,并设置1个辅助变量tmp,保存数据;
时间消耗O(n),空间消耗O(1)
'''
def reverse_linkedlist3(head):
if head == None or head.next == None: #边界条件
return head
p1 = head #循环变量1
p2 = head.next #循环变量2
tmp = None #保存数据的临时变量
while p2:
tmp = p2.next
p2.next = p1
p1 = p2
p2 = tmp
head.next = None
return p1
'''
递归操作,先将从第一个点开始翻转转换从下一个节点开始翻转
直至只剩一个节点
时间消耗O(n),空间消耗O(1)
'''
def reverse_linkedlist4(head):
if head is None or head.next is None:
return head
else:
newhead=reverse_linkedlist4(head.next)
head.next.next=head
head.next=None
return newhead
def create_ll(arr):
pre = ListNode(0)
tmp = pre
for i in arr:
tmp.next = ListNode(i)
tmp = tmp.next
return pre.next
def print_ll(head):
tmp = head
while tmp:
print tmp.val
tmp=tmp.next
a = create_ll(range(5))
print_ll(a) # 0 1 2 3 4
a = reverse_linkedlist1(a)
print_ll(a) # 4 3 2 1 0
a = reverse_linkedlist2(a)
print_ll(a) # 0 1 2 3 4
a = reverse_linkedlist3(a)
print_ll(a) # 4 3 2 1 0
a = reverse_linkedlist4(a)
print_ll(a) # 0 1 2 3 4
以上介绍了Python中单链表翻转的四种常用方法。更多关于Python单链表操作的内容,请参阅本站过往文章或继续浏览相关教程,感谢大家的支持。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













