1.寻找单链表的中间元素
算法的思想就是增加两个指针,第一个每向前走两步,第二个向前走一步,当第一个到达链表尾端时,第二个刚好位于链表中间。
node* search_middle_node(node* head) { if(!head) return NULL; int current=head; int middle=head; int i=0; int j=0; while(current) { if(i/2 > j) { middle=middle->next; j++; } i++; current=current->next; } return middle; }
2.判断链表是否存在环形链表
算法的思想在于使用两个指针,一个每次向前移动两步,另一个每次移动一次,如果当两个指针重合时,则代表是一个环形链表。
bool is_loop_list(node* head) { if(!head) return false; node* first_p=head; node* last_p=head; if(!head->next) return false; do { first_p=first_p->next; last_p=last_p->next->next; }while(last_p && last_p->next && last_p!=first_p) return last_p==first_p? true:false; }
3.二分查找算法
二分查找算法通常用于在一个有序的数组中寻找指定的元素。
递归方式int search_data(int a[],int low,int high,int data) { while(low<=high) { int middle=(low+high)/2; if(a[middle] == data) return middle; if(a[middle]>data) high=middle-1; else low=middle+1; } return -1; }
int search_data(int a[],int low,int high,int data) { int middle=(low+high)/2; if(a[middle] == data) return middle; return a[middle]>data?search_data(a,low,middle-1,data):search_data(a,middle+1,high,data); return -1; }