LeetCode 92. 反转链表 II

92. 反转链表 II

Difficulty: 中等

反转从位置 mn 的链表。请使用一趟扫描完成反转。

说明:
1 ≤ m ≤ n ≤ 链表长度。

示例:

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

Solution

这个题目是反转链表的变种,只不过本题的要求是对链表中间的一部分反转,其余的部分保持原样不变,对链表做原地(in-place)操作比较复杂,我们可以对中间那部分需要反转的链表单独拿出来,然后再接到原来的链表上,这样理解比较简单。

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
​
class Solution:
    def reverseBetween(self, head: ListNode, m: int, n: int) -> ListNode:
        if not head: return None
        res = ListNode(-1)
        pre = res
        mid, i, j = None, 0, 0
        
        while head and j < n:
            cur = head.val
            curNode = ListNode(cur)
            if i < m - 1:
                pre.next = head
                pre = pre.next
                i += 1
            else:
                curNode.next = mid
                mid = curNode
            head = head.next
            j += 1
        while mid:
            pre.next = mid
            mid = mid.next
            pre = pre.next
        pre.next = head
        return res.next

解法二:此解法可以在LeetCode 143. 重排链表 - swordspoet - 博客园一题中得到应用。

class Solution:
    def reverseBetween(self, head: ListNode, m: int, n: int) -> ListNode:
        if not head or m == n: return head
        res = pre = ListNode(-1)
        res.next = head
        for _ in range(m-1):
            pre = pre.next
        
        rest = pre.next
        for _ in range(n-m):
            cur = rest.next
            rest.next = cur.next
            cur.next = pre.next
            pre.next = cur
        return res.next
posted @ 2020-12-20 11:28  swordspoet  阅读(55)  评论(0编辑  收藏  举报