leetcode第九十二题—反转链表 II

又是一道升级题,还记得原来的翻转链表嘛,这个是要求指定m和n翻转链表。或许你忘了链表翻转怎么做,我编一个口诀:
要问把一个链表翻转分几步,总共分五步,第一步定义一个新链表和pre为空的链表,第二步拿掉cur的头节点,第三步,pre节点给cur.next,第四步,cur的头结点给pre,第五步,更新cur(用tmp)。除了那个对列实现,都可以用这个口诀,当然对列实现是最好理解的。

1.题目

原题

反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。

例子

输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL

2.解析

这道题关键是链表的拆分和合并,小知识点。

  • 新生成链表的常用方法,定义一个头部节点,然后指向head,为了保留原链表的特点,将他赋值给另一个链表,遍历另一个链表,可以改变这个链表的指向。
  • 指定start和next,start直到开始反转的前一个节点,end为结束反转前的最后一个节点。
  • start用start.next更新,end和cur更新为start,pre初始化为None,然后链表反转。
  • 更新start.next为pre,end.next为cur

3.python代码

class Solution:
    def reverseBetween(self, head, m, n):
        if head is None or head.next is None:
            return head
        new = ListNode(0)
        new.next = head
        start = new
        for i in range(m-1):
            start = start.next#m-2个节点
        end = cur = start.next
        pre = None
        for i in range(n-m+1):
            next = cur.next
            cur.next = pre#翻转过程,记住
            pre = cur
            cur = next
        start.next = pre
        end.next = cur
        return new.next

你可能感兴趣的:(leetcode第九十二题—反转链表 II)