题目描述:反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4 输出: 1->4->3->2->5->NULL
解法1。为了解决m==1的问题,创建一个头结点指向head,用两个指针记录第m个位置的元素和它的前一个元素,然后该指针往后翻转n-m+1次,再改变指向关系,如下。
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def reverseBetween(self, head, m, n):
"""
:type head: ListNode
:type m: int
:type n: int
:rtype: ListNode
"""
if not head or not head.next or m<0 or n<0 or m>n:
return head
dummy = ListNode(0)
dummy.next = head
pre = dummy
cur = head
i = 1
while i < m and cur:
pre = pre.next
cur = cur.next
i += 1
t1 = pre
t2 = cur
p = None
while i <= n and cur:
tmp = cur.next
cur.next = p
p = cur
cur = tmp
i += 1
t1.next = p
t2.next = cur
return dummy.next