一、一个单链表,不知道长度,写一个函数快速找到中间节点的位置。
物理中有这样一个事实,速度相差一倍的两辆车同时出发,慢车总是在路程的中点。所以就利用这个原理写了下面这个程序。
node* findmiddle(node *head){ node* v,*v2; if(!head){ return NULL; } v2=v=head; while(v2->next && v2->next->next){ v=v->next; v2=v2->next->next; } return v; }
二、写一个函数找出一个单向链表的倒数第n个节点的指针.
node* lastnode(node* head,int n){ int i; if(!head){ return NULL; } node *p=head; node *res=head; for(i=0;i<n;i++){ if( p->next!= NULL){ p=p->next; }else{ return NULL; } } while(p){ p=p->next; res=res->next; } return res; }
三、判断一个链表是否循环
这和判断一个链表是否为循环链表是不一样的。循环链表一定是尾指头,循环的链表可就不一定了,可能在中间某处循环了。
判断循环链表:
int isloop(node *head){ node*p=head; if(p->next){ //有一个元素 p=p->next; }else{ return 0; } while(p && p != head){ p=p->next; } if(!p){ return 0; }else{ return 1; } }
判断链表循环:
int isloop(node *head){ node* v,*v2; v=v2=head; if(head->next){ v2=head->next; }else{ return 0; } while(v2->next && v2->next->next && v != v2){ v=v->next; v2=v2->next->next; } if(v==v2){ return 1; }else{ return 0; } }