92. 反转链表 II
给你单链表的头指针 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]
提示:
- 链表中节点数目为 n
- 1 <= n <= 500
- -500 <= Node.val <= 500
- 1 <= left <= right <= n
解题思路:
- 找到第left个链表节点
- 从这个节点开始采取链表头插法,知道第right个结点结束
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseBetween(struct ListNode* head, int left, int right){
struct ListNode* dummy =(struct ListNode*)malloc(sizeof(struct ListNode)); //先在最前面构建一个dummy node, dummy->next = head;
struct ListNode* pre = dummy; //建立三个node, pre, cur, next。 pre是指向待转换区域的前一个,
//cur只初始化一次,是原链表的pre的后一个,也是第一个待翻转的node。
//cur以后一直不换地方
// next每次要更新,在更新时永远指向cur的后一个node。
dummy->next = head; //先找好pre的位置,并且初始化pre, cur,声明next
for(int i = 0;i<left-1;i++){
pre = pre->next;
}
struct ListNode* cur = pre->next;
struct ListNode* next;
for(int j = left; j<right;j++){
next = cur->next; //写好循环条件,一直做上图的①②③。零是next = cur->next;
cur->next = next->next; //①是cur->next = next->next; ②是next->next = pre->next; ③是pre->next = next;
next->next = pre->next;
pre->next = next;
}
return dummy->next; //返回构建结点的下一个
}