反转链表 ②(力扣No.92)
代码:
ListNode* reverseBetween(ListNode* head, int left, int right) {
int change_len = right - left + 1;//逆置段长度
ListNode* pre_head = nullptr;//初始化逆置段的前驱
ListNode* result = head;//非特殊情况为head(特殊情况为left = 1)
while (head && --left) {//如果left=1,则不会进入while,即34行pre_head会为nullptr
pre_head = head;//保存逆置段的前驱
head = head->next;
}
ListNode* modify_list_tail = head;//保存逆置段首节点(即逆置后的尾结点modify_list_tail))
ListNode* new_head = nullptr;
//就是反转链表一的方法,只不过用change_len控制反转的长度
while (head && change_len) {
ListNode* next = head->next;
head->next = new_head;
new_head = head;
head = next;
change_len--;
}
modify_list_tail->next = head;//此时head指向的是逆置段的后驱
if (pre_head) { pre_head->next = new_head; }
else { result = new_head; }
return result;
}