返回

反转单向链表的三种方法

前端

引言

单向链表是一种常见的线性数据结构,它由一系列节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针.反转单向链表是指将链表中节点的顺序从头到尾反转,使原来链表的尾节点变成头节点,原来链表的头节点变成尾节点.

反转单向链表的三种方法

反转单向链表有三种常见的方法:递归法,迭代法和双指针法.

递归法

递归法是将链表分为两个部分:头节点和剩余部分.然后,递归地反转剩余部分,并将反转后的剩余部分连接到头节点的后面.最后,将头节点的指针指向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).您可以根据自己的需要选择合适的方法来反转链表.