目录
题目
给你单链表的头指针 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]
解题步骤
1、找到开始逆置的结点,记录该结点的前驱
2、从head开始逆置cheng_len = right - left + 1
3、将pre_head 与new_head连接,moditify_head与head连接
代码:
class Solution { public: ListNode* reverseBetween(ListNode* head, int left, int right) { int cheng_len = right - left + 1; ListNode *pre_head = NULL; ListNode *result = head; //求开始逆置的结点记录该节点的前驱 while(head && --left) { pre_head = head; head = head->next; } ListNode *modify_list_tail = head; //指向当前的head,及逆置后的链表尾 ListNode *new_head; while(head && cheng_len) //逆序过程 { ListNode *next = head->next; head->next = new_head; new_head = head; head = next; cheng_len--; } modify_list_tail->next = head; if(pre_head) { pre_head->next = new_head; } else { //说明m从第一个结点开始逆置 result = new_head; } return result; } };