将数组的奇数移到前面偶数到后面&&输出链表的倒数第k个结点

来源:互联网 发布:在淘宝怎么开旗舰店 编辑:程序博客网 时间:2024/05/22 03:40

将数组的奇数移到前面偶数到后面,即采用前面和后面往中间去遍历,如果满足条件则交换的算法。

关键是对于交换满足条件的判断,采用函数指针。

#include<iostream>#include<string>using namespace std;bool Isodd(int n){if(n%2 == 1)return true;elsereturn 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;elsereturn 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;}



0 0