王道单链表课后题

这篇博客详细介绍了单链表的各种操作,包括删除指定值的节点、尾插法建立链表、反向输出链表节点值、删除最小值节点、链表逆置、单增有序排列以及删除特定范围节点等。提供了多种算法实现,涵盖了链表的基本操作和高级应用。
摘要由CSDN通过智能技术生成
bool del_x_linklist(LinkList &L,int val){
	int val= x;
	int k=0;
	LNode *pre=L;
	LNode *q;
	LNOde *p=pre->next;
	while(p!=NULL){
		if(p->data==x)
			q=e;
		    p=p->next;
			pre->next=p;
			free(q);
		else
		    p=pre;
            pre=pre->next;
	return true;			
	}	
	
}
//尾插法建立
bool del_X2_LinkList(LinkList &L,int val){
	int val=x;
	LNode *tail=L;
	LNOde *s=L->next;
    LNode *q
	while(s!=NULL){
		if(s->data!=val)
		{
		
			tail->next=s;
			tail=s;
			s=s->next;
		}
		else{
		
			q=s;
			s=s->next;
			free(q);
		}
	}
	tail->next=NULL;
	return ture;

反向输出链表节点的值

1.采用栈的思想,把链表的每个节点放到栈中,然后在从栈顶端开始输出值

2.忽略头结点从第二个节点开始输出

void rever_print(Linklist &L){
    if(L->next!=NULL)
        rever_print(L->next);
    if(L!=NULL)
        print(L->data);
}
void rever_ignore_print(Linklist &L){
    if(L!=NULL)
        rever_pint(L->next);
}

尝试删除带有头结点的单链表中最小值的节点

bool delminlinklist(Linklist &L){
    Lnode *pre=L,*p=L->next;
    Lnode *minpre=pre,*minp=L->next;
    while(p!=NULL){
        if(p->data<minp->data)
  {          
            minp=p;
            minpre=pre;
            }
            pre=p;
            p=p->next;
}
    minpre->next=minp->next;
    free(minp)'
    return true;
}

5.将链表逆置(不会)

思路一:头插法 头插法特点:元素顺序与输入顺序相反

bool reverselinklist_1(Linklist &L){
    Lnode *p,*tail;
    p=L->next;     从第一个元素节点开始
    L->next=NULL;
    while(p!=NULL){
        tail=p->next;                //tail不断链 
        p->next=L->next;
        L->next=p;
        p=tail;
    }
    return true;
}
      

用三个节点来进行逆置  pre p tail 将P节点指针转向进行断链,此时tail无影响继续遍历

bool reverselinklist(Linklist &L){
    Lnode *pre,p=L,tail=L->next;
    p->next=NULL;  //处理第一个元素节点的后继节点为空
    while(tail!=NULL){
        pre=p;
        p=tail;
        tail=tail->next;
        P->next=pre;
}
//处理最后一个节点
    L->next=p;
    return true;
}

f        

6.设计一个算法使带有头结点的单链表单增有序

思想:断链分前后部分:为了防止断链,进行遍历,需要利用后驱节点

           前半部分最开始一个数据节点 断链

           

bool sortuplist(Linklist &L){
    LNode *pre;
    LNode *p=L->next;tail=p->next;
    p->next=NULL;
    p=tail;
    while(p!=NULL){
    tail=p->next;    
    pre=L;
    while(p!==NULL&&pre->data<p->data){
        pre=pre->next;
}    
    p->next=pre->next;
    pre->next=p;
    p=tail;
}
}

7.删除一个无序链表中位于界定两个值之间的节点(有函数参数给出)

bool dellist(Linklist &L,int max,int min){
    LNode *pre=L,*p=L->next;
    while(p!=NULL)   {
    if(p->data>=min&&p->data<=max){
        pre->next=p->next;
        free(p);
        p=pre->next;
}
    else
        pre=p;
        p=p->next;
}
}

8.找出两个链表公共节点

思路:长短链表寻找链表:同步遍历,长度长的链表先遍历

Linklist samelinkst (Linklist len1,Linklist len2){
    Linklist longlist,shortlist;
    int len1=length(long),len2=length(short);
    int dis;
    if(len1<len2){
        longlist=len2;
        shortlist=len1;
        dis=len2-len1;
}
    else{
        longlist=len1;
        shortlist=len2;
        dis=len1-len2;
} 
    while(dis--)
        longlist=longlist->next;
    
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值