本文主要是介绍【每日刷题】Day31,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1. 2074. 反转偶数长度组的节点 - 力扣(LeetCode)
//思路:双指针遍历。将链表存入数组中,通过双指针下标遍历定位需要反转的组。
typedef struct ListNode LN;
void Reverse(int* arr,int left,int right)//反转函数
{
while(left<right)
{
int tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
left++;
right--;
}
}
struct ListNode* reverseEvenLengthGroups(struct ListNode* head)
{
LN* pmove = head;
int arr[100000] = {0};
int count = 0;
while(pmove)//将链表存入数组中
{
arr[count++] = pmove->val;
pmove = pmove->next;
}
int tmp = 0;
int flag = 1;
int left = 0;
int right = 0;
while(right<count)
{
if((right-left)%2)//如果right下标减去left下标的值为奇数,说明组的长度为偶数,需要反转
{
Reverse(arr,left,right);
}
flag++;
left = right+1;//定位每个组的头尾
right+=flag;
}
if((count-1-left)%2)//处理最后一组,right可能越界,因此右指针为数组尾
{
Reverse(arr,left,count-1);
}
pmove = head;
count = 0;
while(pmove)//将数组存回链表
{
pmove->val = arr[count++];
pmove = pmove->next;
}
return head;
}
这篇关于【每日刷题】Day31的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!