反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL
这个题和206题反转链表思路是一样的,这个题就不用递归了,直接找到开始反转的前一个,然后遍历n-m次链表,然后每次都插到开始反转前一个之后即可。
C++源代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int m, int n) {
ListNode *dummy = new ListNode(-1), *p = dummy;
dummy->next = head;
for(int i=0;i<m-1;i++) p = p->next;
ListNode *cur = p->next;
for(int i=m;i<n;i++){
ListNode *tmp = cur->next;
cur->next = tmp->next;
tmp->next = p->next;
p->next = tmp;
}
return dummy->next;
}
};
python3源代码:
class Solution:
def reverseBetween(self, head, m, n):
"""
:type head: ListNode
:type m: int
:type n: int
:rtype: ListNode
"""
dummy = ListNode(-1)
p = dummy
dummy.next = head
for i in range(m-1):
p = p.next
cur = p.next
for i in range(n-m):
tmp = cur.next
cur.next = tmp.next
tmp.next = p.next
p.next = tmp
return dummy.next