反转从位置 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
实现方法其实有两种,一种是递归的方式,一种是双指针的方式,两种方式都是很巧妙的方法,这里展示双指针的操作,代码如下:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int left, int right) {
if(left == right) return head;
auto ans = new ListNode(-1, head), ptr = ans;
for(int i = 0; i < left - 1; ++i)
ptr = ptr->next;
auto p1 = ptr->next;
for(int i = 0; i < right - left; ++i)
{
auto temp = p1->next;
p1->next= temp->next;
temp->next = ptr->next;
ptr->next = temp;
}
return ans->next;
}
};