typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
//逆序输出带头结点链表的数据
void R_Print(LinkList &L){
if(L->next!=NULL){
R_Print(L->next);
}
if(L!=NULL) print(L->data);
}
//删除带头结点链表中最小数据的节点
LinkList Del_Min(LinkList &L){
LNode *pre=L,*p=L->next;
LNode *min_pre=L,*min_p=L->next;
while(p!=NULL){
if(p->data<min_p->data){
min_p=p;
min_pre=pre;
}
pre=p;
p=p->next;
}
min_pre->next=min_p->next;
free(min_p);
return L;
}
//利用头插法,将带头结点的链表就地逆置(空间复杂度为O(1))
LinkList Reverse_1(LinkList &L){
LNode *p=L->next,*r;//r存储p的后置节点,防止断链。
L->next=NULL;
while(p!=NULL){
r=p->next;
p->next=L->next;
L->next=p;
p=r;
}
return L;
}
//使一个带头结点的单链表递增有序
void Sort(LinkList &L){
LNode *p=L->next,*r=p->next,*pre; //r存储p的后置节点,防止断链。pre是要插入位置的前置节点。
p->next=NULL; //构造一个只含原第一个数据节点的有序表。
p=r;
while(p!=NULL){
r=p->next;
pre=L;
while(pre->next!=NULL&&pre->next->data<p->data){
pre=pre->next;
}
p->next=pre->next;
pre->next=p;
p=r;
}
}
//找出两个链表的第一个公共节点。
/* 如果两个链表有公共节点,由于节点的后继节点唯一,两个链表剩余的节点必是同一批节点,类似Y字形。因此将问题简化,如果两个链表有公共节点,那么他们的最后一个节点一定是同一个节点,如果不是同一个节点则证明没有公共节点。所以我们可以在长链表前边去掉多出的k个元素。只遍历后边长度相同的链表即可。时间复杂度为O(len1+len2),而暴力遍历两个链表时间复杂度为O(len1*len2)。
*/
LinkList Search_1st_common(LinkList &L1,LinkList &L2){
int len1=Length(L1),len2=Length(L2),dist;
LinkList LList,SList;
if(len1>len2){
LList=L1; SList=L2;
dist=len1-len2;
}
else{
LList=L2; SList=L1;
dist=len2-len1;
}
while(dis--) LList=LList->next;
while(LList!=NULL){
if(LList==SList){
return LList;
}
else{
LList=LList->next;
SList=SList->next;
}
}
return NULL;
}