又是一道升级题,还记得原来的翻转链表嘛,这个是要求指定m和n翻转链表。或许你忘了链表翻转怎么做,我编一个口诀:
要问把一个链表翻转分几步,总共分五步,第一步定义一个新链表和pre为空的链表,第二步拿掉cur的头节点,第三步,pre节点给cur.next,第四步,cur的头结点给pre,第五步,更新cur(用tmp)。除了那个对列实现,都可以用这个口诀,当然对列实现是最好理解的。
1.题目
原题
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
例子
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL
2.解析
这道题关键是链表的拆分和合并,小知识点。
- 新生成链表的常用方法,定义一个头部节点,然后指向head,为了保留原链表的特点,将他赋值给另一个链表,遍历另一个链表,可以改变这个链表的指向。
- 指定start和next,start直到开始反转的前一个节点,end为结束反转前的最后一个节点。
- start用start.next更新,end和cur更新为start,pre初始化为None,然后链表反转。
- 更新start.next为pre,end.next为cur
3.python代码
class Solution:
def reverseBetween(self, head, m, n):
if head is None or head.next is None:
return head
new = ListNode(0)
new.next = head
start = new
for i in range(m-1):
start = start.next#m-2个节点
end = cur = start.next
pre = None
for i in range(n-m+1):
next = cur.next
cur.next = pre#翻转过程,记住
pre = cur
cur = next
start.next = pre
end.next = cur
return new.next