递归 | 链表 | 双指针:力扣92. 反转链表 II

1、题目描述:

递归 | 链表 | 双指针:力扣92. 反转链表 II_第1张图片

2、题解:

方法1:递归
不要跳进递归,而是把递归函数返回的看成已经解决的子问题。

class Solution:
    def reverseBetween(self, head, m, n):
        #递归
        if m == 1:
            return self.reverseN(head,n)
        head.next = self.reverseBetween(head.next,m-1,n-1)
        return head
    #反转链表前N个节点
    def reverseN(self,head,n):
        if n == 1:
            return head
        last = self.reverseN(head.next,n-1)
        successor = head.next.next
        head.next.next = head
        head.next = successor
        return last

注意:反转链表是:

#输入一个节点head,将“以head为起点”的链表反转,并返回反转之后的头结点
def reverse(self,head):
    #反转整个链表
    if not head or not head.next:return head
    last = reverse(head.next)
    head.next.next = head
    head.next = None
    return last

反转前N个链表是:

#反转链表前N个节点
def reverseN(self,head,n):
    if n == 1:
        return head
    last = self.reverseN(head.next,n-1)
    successor = head.next.next
    head.next.next = head
    head.next = successor
    return last

方法2:双指针:

迭代的思路是:先用一个for 循环找到第m个位置,然后再用一个for循环将m和n之间的元素反转。
对于链表的反转,有个核心:一定要先保存即将反转的位置的下一个指针

third = cur.next
cur.next = prev
prev = cur
cur = third

思路:

1、初始化 prev = None,cur = head
2、先找到m的位置,此时prev、cur指针分别指向第m-1个结点、第m个结点
3、初始化 con、tail指针, con = pre,tail = cur,con 指向的是第m-1个结点,此结点是新链表的头部;
tail指向链表的第m个结点,此结点是反转后链表的尾部。
4、然后开始反转,
    third = cur.next
    cur.next = prev
    prev = cur
    cur = third
完成第n个结点的反转,此时,prev指向第n个结点,cur指向第n+1个结点
5、最后要执行链接:con.next = prev,tail.next = cur

Python代码如下:

class Solution:
    def reverseBetween(self, head, m, n):
        #链表、双指针
        if not head:return None
        prev,cur = None,head
        while m > 1:
            prev = cur
            cur = cur.next
            m,n = m - 1, n - 1
        con,tail = prev,cur
        while n:
            third = cur.next
            cur.next = prev
            prev = cur
            cur = third
            n -= 1
        #判断con是否移动,也就是判断m是否为1,如果不为1,那么就con.next = prev;
        #否则,表示反转第1个位置到第n个位置,那么此时头结点就是第n个结点
        if con:
            con.next = prev
        else:
            head = prev
        tail.next = cur
        return head

3、复杂度分析:

方法1:
时间复杂度:O(N)
空间复杂度:O(N)
方法2:
时间复杂度:O(N)
空间复杂度:O(1)

你可能感兴趣的:(LeetCode)