92. 反转链表 II
Difficulty: 中等
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
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