思路:
单次遍历链表完成反转,使用前插法,首先确定插入位置,然后从插入位置的第二个元素开始删除,插入,知道指定位置结束。
代码
class Solution {
public:
ListNode *reverseBetween(ListNode *head, int left, int right) {
//创建头指针 指向head
ListNode *dummyNode = new ListNode(-1);
dummyNode->next = head;
//查找left前驱
ListNode *pre = head;
for (int i = 0; i < left - 1; i++)
pre = pre->next;
//定位前插长度right-left 并将其前插到left-1后
ListNode *cur = pre->next;//从第二个结点开始前插 因为第一个结点本身在left-1后面
ListNode *next;
for (int i = 0; i < right - left; i++) {
//保留当前移动结点的后驱
next = cur->next;
//删除当前移动结点的位置
cur->next = next->next;
//将结点前插到pre后面
next->next = pre->next;
pre->next = next;
}
return dummyNode->next;
}
};