目录:
问题一:递归删除一个不带头结点的单链表L中的所有值为x的结点
问题二:反向输出单链表中节点的值
问题三 :删除单链表中最小值的节点
问题四 :删除值介于 a b之间的节点
问题五 :找出两个链表的公共节点
//问题一:递归删除一个不带头结点的单链表L中的所有值为x的结点 void delX(LinkList &h,elemType x){ LNode *t; if(h==NULL) return; else if(h->data==x){ t=h; h=h->next; free(t); delX(h,x); }else delX(h->next,x); } //问题一:方法二 迭代 void delX2(LinkList &L,elemType x){ while(L&&L->data==x) L=L->next; LNode *pre=L; LNode *p=L->next; LNode *t; while(p){ while(p&&p->data==x){ t=p; p=p->next; free(t); } pre->next=p; pre=p; if(p) p=p->next; } }
//问题二:反向输出单链表中节点的值 void printReverse(LinkList L){ if(L->next!=NULL) printReverse(L->next); printf("%d ",L->data); }
//问题三 删除单链表中最小值的节点 void delMin(LinkList &L){ LNode *pre=L; LNode *p=L->next; LNode *min = L->next; while(p->next){ if(p->next->data<min->data){ min = p; } p=p->next; } LNode *t=min->next; min->next=min->next->next; free(t); }
//问题四 删除值介于 a b之间的节点 void delBetween(LinkList &L,elemType a,elemType b){ LNode *pre=L,*p=L->next; while(p){ while(p&&p->data>=a&&p->data<=b) p=p->next; pre->next=p; pre=p; if(p) p=p->next; } }
//问题五 找出两个链表的公共节点 LinkList search_common(LinkList L1,LinkList L2){ int len1=0,len2 = 0; LNode *p1=L1->next,*p2 = L2->next; while(p1){ len1++; p1=p1->next; } while(p2){ len2++; p2=p2->next; } LNode *longList; LNode *shortList; int dist; if(len1>len2){ longList = L1->next; shortList = L2->next; dist = len1-len2; }else{ longList = L2->next; shortList = L1->next; dist = len2-len1; } while(dist--) longList = longList->next; while(longList!=shortList){ longList = longList->next; shortList = shortList->next; } return longList; }