重新排序数组
描述
根据特定条件重新排序数组,如将奇数排到偶数前面。将负数排到偶数前面。
思路:
设置两个指针,前指针和后指针。将条件作为一个函数传入,两个指针向中间移动,不符和条件的交换。
代码:
bool fun(int n)
{
if (n % 2 == 0)
return 0;
else
return 1;
}
void ReorderArray(int* arr, int len, bool (*fun)(int n))
{
int* phead = arr;
int* pend = arr + len - 1;
while (phead < pend)
{
while (phead < pend && fun(*phead) == 1)
{
phead++;
}
while (phead < pend && fun(*pend) == 0)
{
pend--;
}
if (phead < pend)
{
int temp = *phead;
*phead = *pend;
*pend = temp;
}
}
}
void ReorderArrayWith01(int* arr, int len)
{
ReorderArray(arr, len, fun);
}
倒置链表
思路:
1.循环方式需要用三个指针,p,为了连接到前面的节点,需要ppre,为了防止断链,需要pnext。
2.递归方式
问题规模缩小
结果
假设2开头的链表已经反转成功,接下来只要将2的next指向1,而1的next指向null即可。
其实只要将两个节点反过来即可。
代码:
ListNode* ReverseList(ListNode* head)
{
if (head == NULL)
return NULL;
if (head->next == NULL)
return head;
ListNode* reversedhead = NULL;
ListNode* p = head;
ListNode* ppre = NULL;
ListNode* pnext = NULL;
while (p!=NULL)
{
pnext = p->next;
p->next = ppre;
ppre = p;
p = pnext;
}
reversedhead = ppre;
return reversedhead;
}
ListNode* ReverseListR(ListNode* head)
{
if (head == NULL ||head->next==NULL)
return head;
ListNode *res=ReverseListR(head->next);
head->next->next = head;
head->next=NULL;
return res;
}