LeetCode高频100题刷题记录之——反转链表

1 问题描述

给定一个链表,将其反转。

2 迭代法求解

思路很简单,首先定义两个空链表,然后遍历原始链表,将原始链表当前节点的值赋给链表1,再让链表1的next指向链表2,然后再令链表2等于链表1,经过以上操作,链表2最后的数据就是原始链表中反转的数据,需要注意的是,使用python语言实现时,每次执行完之后要清空链表1,否则会出错。

python代码实现:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        if head is None:
            return head
        else:
            p1 = ListNode()
            p2 = ListNode(10000)  # 赋一个超出head.val的取值范围的值
            while head is not None:
                if p2.val == 10000:
                    p2.val = head.val
                else:
                    p1.val = head.val
                    p1.next = p2
                    p2 = p1
                    p1 = ListNode()  # 一定要清空
                head = head.next
            return p2

时间复杂度为 O ( n ) O(n) O(n),空间复杂度为 O ( n ) O(n) O(n)

3 递归求解

首先判断head是不是空的,以及head是不是只有一个元素,如果符合上面两种情况,那就返回head自身就行了。要是head需要反转,那么首先定义cur,根据递归规则,第一个cur是等于head最后一个结点的,然后,将最后一个结点的next指向其前一个结点,就实现了一层的反转,这时候要令这个结点为None,否则就会出现环了。因此,由于递归的作用,最后一个结点会指向前一个,而前一个与后一个的结点之间的联系会被打断,也就是说,目前指向前一个结点的有前前一个结点以及后一个结点,由于递归,这个head是不断嵌套的,最终完成了完整的反转,具体如下图示例:

LeetCode高频100题刷题记录之——反转链表_第1张图片

上图中,圆括号表示结点,直线表示原始链表关系,反向箭头及其数字代表了算法反转的具体步骤。

python代码实现如下:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        if (head is None) or (head.next is None):
            return head
        else:
            cur = self.reverseList(head.next)
            head.next.next = head
            head.next = None
            return cur

时间复杂度为 O ( n ) O(n) O(n),空间复杂度为 O ( n ) O(n) O(n)(栈所需要的空间)。

你可能感兴趣的:(Leetcode刷题记录,python,链表,算法,数据结构,leetcode)