1.题目:
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明: 1 ≤ m ≤ n ≤ 链表长度。
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL
2.代码:
# 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:
return None
# cur 指向第一个要转的位置,pre指向cur之前
cur, prev = head, None
while m > 1:
prev = cur
cur = cur.next
m, n = m - 1, n - 1
'''
tail 一直指向3,因为3就是最后一个
prev 一直指向
1->2—>{3-> 4-> 5}->6->7 ==> 1->2—>{5-> 4-> 3}->6->7
| | | | | | |
con cur third con pre tail cur
pre
'''
tail, con = cur, prev
while n:
third = cur.next
cur.next = prev
prev = cur
cur = third
n -= 1
# con == None 即prev == None,即从第1个开始置换,那么head = prev
if con:
con.next = prev
else:
head = prev
tail.next = cur
return head