代码题(单链表1)

1.在带头结点的单链表L中,删除所有值为x的节点,并释放其空间,假设值为x的节点不唯一,试编写算法以实现上述操作

#include <iostream>

#include <stdbool.h>
#include <cstdio>
#include <stdlib.h>
/*第一题:在带头结点的单链表L中,删除所有值为x的节点,并释放其空间,假设值为x的节点不唯一,试编写算法以实现上述操作*/
//创建单链表
typedef struct LNode {
    int data;
    struct LNode *next;
} LNode, *LinkList;
//初始化
bool InitList (LinkList &L) {
    L=(LNode*)malloc(sizeof(LNode));
    L->next= NULL;
    return true;
}
//插入节点
bool ListInsert(LinkList &L,int i,int e) {
    LNode *p=L;
    int j=0; //头节点是第0个节点
    while(p!=NULL&&j<i-1) {
        p=p->next;
        j++;
    }
    if(p==NULL)
        return false;
    LNode *s=(LNode*)malloc(sizeof(LNode));
    s->data=e;
    s->next=p->next;
    p->next=s;
    return true;

}
//删除节点(以下两个算法扫描一遍链表,时间复杂度为O(n),空间复杂度为O(1))
//法一:用p从头至尾扫描单链表,pre指向*p节点的前前驱。若p所指节点的值为x,则删除,并让p移向下一个节点,否则让pre,p指针同步后移一个节点。本算法是在无序单链表中删除满足某种条件的的所有节点,这里的条件是节点的值为x。实际上,这个条件是可以任意指定的,只要修改if条件即可。比如,我们要求删除值介于mink和maxk之间的所有节点,则只需将if语句修改为if(p->data>mink&&p->data<maxk).
void Linkdelete01(LinkList &L,int x) {
    LNode *p=L->next,*pre=L,*q;
    while(p!=nullptr) {
        if(p->data==x) {
            q=p;
            p=p->next;
            pre->next=p;
            free(q);
        }
        else {
            pre=p;
            p=p->next;
        }
    }

}
//法2:采用尾插法建立单链表。用p指针扫描L的所有节点,当其值不为x时,将其链接到L之后,否则将其释放。
void Linkdelete02(LinkList &L,int x) {
    LNode *p=L->next,*r=L,*q;
    while(p!=NULL) {
        if(p->data!=x) {
            r->next=p;
            r=p;
            p=p->next;
        }
        else {
            q=p;
            p=p->next;
            free(q);
        }
    }
    r->next=NULL;
}
int main(void) {

    LinkList L;
    InitList(L);
    ListInsert(L, 1, 2);
    ListInsert(L, 2, 3);
    ListInsert(L, 3, 2);
    ListInsert(L, 4, 4);
    ListInsert(L, 5, 2);

    int x=2;
    Linkdelete01(L,2);

    LNode* p = L->next;
    while (p != NULL) {
        printf("%d ", p->data);
        p = p->next;
    }


    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值