一.带头结点的按位查找
之前在研究单链表的插入时是寻找第i-1个结点,所以我们这里还按照之前的思路进行循环查找。
//按位查找,结果返回第i个元素。
LNode* GetElem(LinkList L,int i){ //因为返回的是一个结点的地址
if(i<0)
return NULL; //默认头结点是第0个结点
LNode *p; //p是扫描指针
p=L;
for(int j=0;j<i&&p!=NULL;j++){//和插入代码的区别是循环到i(找到第i个元素)
p=p->next;
}
return p; //返回p指针,if(p!=NULL)不能写,若为空,p返回NULL
}
二.带头结点的按值查找
按值查找相对简单,只要进行元素值的比较即可。
LNode* LocateElem(LinkList L,int e){
LNode *p;
p=L->next; //可以直接从第一个结点开始找
for(int j=0;p->data!=e&&p!=NULL;j++){
p=p->next;
}
return p;//返回p指针,若为空返回NULL
时间复杂度也是O(n)。
三.求单链表的长度
核心思想还是循环的使用,搞懂在哪里跳出循环。
int LengthList(LinkList L){
int Len;
LNode *p;
p=L; //p为扫描指针
for(Len=0;p->next!=NULL;len++){
p=p->next;
}
return len;
}