边工作边刷题:70天一遍leetcode: day 20-4
Reverse Linked List II
要点:和k-group类似,要点上唯一的区别是k-group那题如果不够k个结点,不reverse,所以不能one-pass,这题可以one-pass
- 已经多次见过了cur,cur.next的模式,cur是pre,cur.next是当前要处理的结点
- 计数:m:因为要落在开始结点的前一个,所以是从dummy开始,移动次数为m-1(这里记忆方法是移动次数+1是覆盖的结点数,而loop是移动次数>0),java中可以用--m>0来表示,python只能m先-1。n:这里的loop是要处理的结点个数,所以是n-m+1
- reverse两步走:结点组reverse:切记pre初始为null而不是前一个点,外部连接是分开进行的。对外部连接,只要记住是reverse的过程是不会自动连好外部结点就可以了。
# 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
"""
dummy = ListNode(0)
dummy.next = head
cur = dummy
n=n-m+1
m-=1
while m>0 and cur:
cur=cur.next
m-=1
if not cur: return head
newpre = cur
pre = None
cur = cur.next
while cur and n>0:
next = cur.next
cur.next = pre
pre = cur
cur = next
n-=1
newpre.next.next = cur
newpre.next = pre
return dummy.next