数据结构 5.5

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;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值