Reverse a linked list from position m to n. Do it in one-pass.
Note: 1 ≤ m ≤ n ≤ length of list.
Example:
Input: 1->2->3->4->5->NULL, m = 2, n = 4
Output: 1->4->3->2->5->NULL
思路
就是个链表题,注意细节就好。
这个题的链表的头是可能会换掉的,所以要用dummy节点。
还要注意移动的次数,按照例子算一下。
首先是将curr移动到reverse位置的开头,移动m-1次即可,将prev和curr都要记下来。
然后往前走一步(也可以不走,因为反正curr.next的赋值后面也会被覆盖),开始做reverse。
到end的位置就开始串起来就好了。注意判断末尾的节点是不是null。
代码
class Solution:
def reverseBetween(self, head: ListNode, m: int, n: int) -> ListNode:
if not head or not head.next:
return head
dummy = ListNode(None)
dummy.next = head
prev = dummy
curr = head
while curr and m > 1:
prev = curr
curr = curr.next
m -= 1
n -= 1
start_prev = prev
start_curr = curr
while curr and n > 0:
temp = curr.next
curr.next = prev
prev = curr
curr = temp
n -= 1
start_prev.next = prev
if start_curr:
start_curr.next = curr
return dummy.next