题目描述:
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-linked-list-ii
解题思路与代码:
### 解题思路
首先,需要设计一个函数,可以完成反转链表的前N个结点的操作,接着根据需要反转的长度N-M+1,找到第M-1个结点,反转后面的N-M+1个结点即可。此处需要注意的是,需要考虑的是反转从头结点开始的情况,所以需要新建一个虚拟头结点,保证不出错。
### 代码
```python
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution(object):
def reverseN(self, head, n):
if n == 1:
return head
tail = head.next
p = self.reverseN(head.next, n-1)
head.next = tail.next
tail.next = head
return p
def reverseBetween(self, head, left, right):
"""
:type head: ListNode
:type left: int
:type right: int
:rtype: ListNode
"""
p = ListNode(0, head)
q = p
cnt = right - left + 1
while left > 1:
p = p.next
left -= 1
p.next = self.reverseN(p.next, cnt)
return q.next
```