题目:
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4 输出: 1->4->3->2->5->NULL
思路:
先讨论特殊情况。其次,找到m,n所对应的链表的位置,用start,end标记。p,q标记start的前一位和end的后一位。start~end之间的节点即为要反转的节点。定义一个函数来实现。反转之后,让p指向反转后链表段的开始节点;反转后链表段尾节点指向q。
代码:
# 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 or not head.next or m==n:
return head
H = ListNode(0)
H.next = head
p,end = H,head
while m>1:
p = p.next
m-=1
start = p.next
while n>1:
end = end.next
n-=1
q = end.next
end.next = None
cur = self.Reverse(start)
p.next = cur
start.next = q
if p==H:
return p.next
return head
def Reverse(self,start):
head1 = None
pre,cur,nex = head1,start,start.next
while nex!=None:
cur.next = pre
pre = cur
cur = nex
nex = nex.next
cur.next = pre
return cur