示例 1:
输入:head = [1,2,3,4,5], left = 2, right = 4 输出:[1,4,3,2,5]
思路:
1.遍历链表,将要反转的数据先储存在数组中,并记录要反转的长度。
2.重新遍历链表,从数组的最后一个数开始往前,向链表要反转的部分赋值。
3.当left==right,return head;即可。
如样例1:
把2 3 4 储存到数组,
之后按 4 3 2 的顺序从第2个节点开始重新赋值到链表。
下面是代码,代码中有注释。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseBetween(struct ListNode* head, int left, int right){
if(left==right) {
return head;
}//left=right,不需要反转,return head即可。
struct ListNode* leftnode=NULL;//用来记录反转的初始位置
int a[500]={0};
struct ListNode* head0=head;
int cnt=0;//用来判断是否发现左节点(开始反转的初始位置)
int book=0;//记录链表中元素的位置
int len=0;//要反转的长度
//遍历链表。
while(head0) {
book++;
//判断当前位置是否为left。
if(book==left) {
leftnode=head0;//记录下要反转的开始位置
cnt=1;//cnt=1,表示发现左节点。
}
//发现左节点后开始赋值到数组,并计算长度。
if(cnt>0) {
a[len]=head0->val;//len开始为0。
len++;
}
//到达右节点(反转结束的位置)停止链表遍历,跳出循环。
if(book==right) {
break;
}
head0=head0->next;
}
//从数组最后往前,把数组里的值赋值给要反转的部分。len记录了反转的长度。
for(int i=len-1;i>=0;i--) {
leftnode->val=a[i];
leftnode=leftnode->next;
}
return head;
}