将数组的奇数移到前面偶数到后面,即采用前面和后面往中间去遍历,如果满足条件则交换的算法。
关键是对于交换满足条件的判断,采用函数指针。
#include<iostream>
#include<string>
using namespace std;
bool Isodd(int n){
if(n%2 == 1)
return true;
else
return false;
}
void reorder(int *numbers,int length,bool (*func)(int)){
if(length == 0|| numbers == NULL)
return;
int beg =0,end = length-1;
while(beg<end){
while(beg<end && func(numbers[beg]))
beg++;
while(beg<end && !func(numbers[end]))
end--;
if(beg < end){
int temp = numbers[beg];
numbers[beg] = numbers[end];
numbers[end] = temp;
}
}
}
int main(){
int numbers[] = {2,4,8,1,3,9,6};
reorder(numbers,7,Isodd);
for(int i =0;i<7;i++)
printf("%d",numbers[i]);
system("PAUSE");
return 0;
}
输出链表的倒数第k个结点。题目简单,先一个指针走k步,然后另一个指针和先前的指针一起走,等先前的指针指向末尾,则另一个指针达到倒数第k个点。
关键是寻找倒数k时的健壮性。
#include<iostream>
#include<string>
#include<stack>
using namespace std;
struct ListNode{
int value;
ListNode* next;
};
//增加元素
void AddToList(ListNode** pHead,int value){
ListNode* pTemp = *pHead;
pTemp = (ListNode *)malloc(sizeof(ListNode));
pTemp->value = value;
pTemp->next = NULL;
if(*pHead == NULL)
*pHead = pTemp;
else{
ListNode* pNTemp = *pHead;
while(pNTemp->next != NULL)
pNTemp = pNTemp->next;
pNTemp->next = pTemp;
}
}
//求长度
int ListLen(ListNode* pHead){
int n =0;
while(pHead != NULL){
pHead = pHead->next;
n++;
}
return n;
}
//返回0则表示不存在
int getlastk(ListNode* pHead,int k){
if(pHead == NULL || k == 0)
return 0;
int len = ListLen(pHead);
ListNode *pbeg = pHead;
ListNode *pend = NULL;
for(int i =0;i<k-1;i++){
if(pbeg->next != NULL)
pbeg = pbeg->next;
else
return 0;
}
pend = pHead;
while(pbeg->next != NULL){
pbeg = pbeg->next;
pend = pend->next;
}
return pend->value;
}
int main(){
ListNode* pHead = NULL;
AddToList(&pHead,1);
AddToList(&pHead,2);
AddToList(&pHead,3);
AddToList(&pHead,4);
AddToList(&pHead,5);
AddToList(&pHead,6);
int value;
value = getlastk(pHead,2);
printf("%d\n",value);
value = getlastk(pHead,7);
printf("%d\n",value);
system("PAUSE");
return 0;
}