LeetCode92反转链表2
给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。
示例 1:
输入:head = [1,2,3,4,5], left = 2, right = 4
输出:[1,4,3,2,5]
示例 2:
输入:head = [5], left = 1, right = 1
输出:[5]
代码
从第left个结点开始,在h和t之间插入p。插入right-left次,pre记录(0,left)之间不需要反转的结点,更新pre。
使用flag=1标记没有前置结点(即left=0),直接在头部前插入,所以head值需要更新
ListNode* reverseBetween(ListNode* head, int left, int right) {
ListNode* h = head, * t = head,*pre=head;
int count = 1;
while (count < left) {
count++;
pre = h;
h = h->next;
t = t->next;
}
ListNode* p = t->next;
int flag = 0;
if (pre == h)
flag = 1;
while (p != nullptr&&count<right) {
t->next = p->next;
p->next = h;
h = p;
p = t->next;
count++;
if (flag == 1)
head = h;
else
pre->next = h;
}
return head;
}