首页 > 其他分享 >不带头结点单链表题

不带头结点单链表题

时间:2022-12-11 20:12:03浏览次数:49  
标签:pre 链表 表题 单链 结点 head next linklist

1.编写函数linklist dex(linklist head, datatype x),删除不带头结点单链表head中的第一个值为x的结点。

思路:对链表head进行循环遍历,若找到含有x的结点,直接删除。

linklist dex(linklist head, datatype x){
        linklist p = head;
        linklist pre = NULL;
        while(p && p->info!=x){  //查找第一个x的位置
            pre=p;
            p=p->next;
        }
        if(p){    //找到位置,进行删除
            if(pre==NULL){ //如果是第一个单独处理
                head=p->next;
            }else{
            	pre->next=p->next;
        	}
            free(p);
        } 	
        return head;
}

2.假设线性表(a1,a2,a3,...,an)采用不带头结点的单链表存储,请设计算法函数linklist reverse1(linklist head), 和void reverse2(linklist *head)将不带头结点的单链表head倒置,是变成(an,an-1,...,1)。

思路:将链表的值放在一个顺序表里,在顺序表里进行逆置,然后在依次赋值到链表中。

思路2:直接利用头插法,在建立新的链表的基础上,将原链表的值赋值到上面。

答案思路:利用头插法,将原有的链表赋值到新的链表上,然后在原来的head上使用头插法。

//带头结点
linklist reverse1(linklist head){
    linklist p=head->next;
    linklist nhead = (linklist)malloc(sizeof(node)); //新链表的头结点
    nhead->next=NULL;
    while(p){   //采用头插法建立逆置链表
        linklist s= (linklist)malloc(sizeof(node));
        s->next=nhead->next;
        s->info=p->info;
        nhead->next=s;
        p=p->next;
    }
    return nhead;
}

//不带头结点
void reverse2(linklist *head){
    linklist p = head;
    linklist nhead = *head; //对第一个节点单独处理
    nhead->next=NULL;
    p=p->next;
    while(p){ //从第二个节点开始处理
        linklist s= (linklist)malloc(sizeof(node));
        s->next=nhead;
        s->info=p->info;
        nhead=s;
        p=p->next;
    }
    *head=nhead; //将以逆置的值赋给原来的head
}

参考答案代码:

linklist reverse1(linklist head){
    linklist s,p=head;
    head=NULL;
    while(p){   //采用头插法建立逆置链表
        s=p;
        s->next=head;
        head=s;
        p=p->next;
    }
    return head;
}


void reverse2(linklist *head){
    linklist s,p = *head;
    *head=NULL;
    while(p){ 
        s=p;
        s->next=*head;
        *head=s;
        p=p->next;
    }
}

3.假设不带头结点的单链表head是升序排列的,设计算法函数算法函数linklist insert(linklist head, datatype x),将值为x的节点插入到链表head中,并保持链表的有序性。分别构造插入的表头,表中,表尾3中情况。

思路:先遍历找到x的位置,即大于x的地方,然后再进行插入。

linklist insert(linklist head,datatype x){
    linklist pre,p=head;
    while(p && p->info < x){
        pre=p;
        p=p->next;
    }
    linklist s = (linklist)malloc(sizeof(node));
    s->info=x;
    if(pre==NULL){ //头插入
        s->next=head;
        head=s;
    }else{  //中间和尾插入
        s->next=p; //这里要从p的前面插入,因为x小于p
        pre->next=s;
    }
    return head;
}

4.编写算法函数linklist delallx(linklist head, int x),删除不带头节点单链表head中所有值为x的结点。

思路:遍历链表,若发现结点信息是x,则直接让其前驱结点指向下下个节点。

linklist delallx(linklist head, int x){
    linklist p=head;
    if(p->info==x){
        head=head->next;
        free(p);
    }else{
        while(p && p->info != x){
            if(p->info=x){
                pre=p->next;
                free(p);
                p=pre->next;
            }else{
                pre=p;
            	p=p->next;
            }
        }
    }
    return head;
}

参考书代码:

linklist delallx(linklist head, int x){
    linklist p,pre;
    p=head;
    pre=NULL;
    while(p){
        while(p && p->info != x){
            pre=p;
            p=p->next;
        }
       if(p){ //如果p不为空。空表示表中无x
            if(pre==NULL){ //头位置是x
            	head=p->next;
            	free(p);
            	p=head;
        	}else{ //其他位置是x
            	pre->next=p->next;
            	free(p);
            	p=pre->nxet;
        	}
       }
    } 
    return head;
}

标签:pre,链表,表题,单链,结点,head,next,linklist
From: https://www.cnblogs.com/stack0verflow/p/16974321.html

相关文章