92,反转链表 II
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明: 1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4 输出: 1->4->3->2->5->NULL
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-linked-list-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
先实现用于反转单链表的辅助函数 reverse(linked_list)
。
从头节点向后走 m - 1 步,找到 m 对应的节点 p1,以及 p1 的前一个节点 p1_prev(当 m 等于 1 时,p1_prev 是 NULL),然后再走 n - m 步,找到 n 对应的节点 p2。
将列表分成三段:
并且当 p1_prev 是 NULL 时,left 为 NULL。
使用 reverse() 方法对 middle 进行反转,然后再将这三段接起来,即可得到最终结果。
# Definition for singly-linked list. # class ListNode(object): # def __init__(self, x): # self.val = x # self.next = None class Solution(object): @staticmethod def print_linked_list(head): temp = head while temp is not None: print(temp.val) temp = temp.next def reverse(self, linked_list): if linked_list is None or linked_list.next is None: return linked_list p1 = linked_list p2 = linked_list.next p1.next = None while p2 is not None: p2_next = p2.next p2.next = p1 p1 = p2 p2 = p2_next return p1 def reverseBetween(self, head, m, n): """ :type head: ListNode :type m: int :type n: int :rtype: ListNode """ if head is None or head.next is None or m == n: return head p1 = head p1_prev = None for _ in range(m - 1): p1_prev = p1 p1 = p1.next if p1_prev is None: left = None left_last = None else: left = head left_last = p1_prev p1_prev.next = None p2 = p1 for _ in range(n - m): p2 = p2.next right = p2.next p2.next = None middle = self.reverse(p1) middle_last = p1 if left is None: middle_last.next = right return middle left_last.next = middle middle_last.next = right return left