数据结构基本知识——链表代码训练(一)

190 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第32天,点击查看活动详情

01.设计一个递归算法,删除不带头结点的单链表L中所有值为×的结点。

void Delete_X(LinkList &L, ElemType x){
    LinkList h=L;
    while(h && h->data == x){
        h = h->next;
    }
    while(h && h->next){
        LNode * p = h->next;
        if(p->data == x){
            h->next=p->next;
            free(p);
        }
    }
}

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

void Delete_X(LinkList &L, Elemtype x){
    while(L->next != NULL){
        if(L->next->val == x){
            LNode * node;
            node = L->next;
            L->next = node->next;
            free(node);
        }
    }          
}

03.设L为带头结点的单链表,编写算法实现从尾到头反向输出每个结点的值。

void List_Reverse(LinkList &L){
    LNode * p=L->next, *q;
    while(p){
        q = p->next;
        p->next = L->next;
        L->next = p;
        p = q;
    }
}

04.试编写在带头结点的单链表L中删除一个最小值结点的高效算法(假设最小值结点是唯一的).

void Delet_Min(LinkList &L){
    LNode * p=L;
    LNode h=L;
    if(!L->next){
        return;
    }
    while(h->next){
        if(h->next->data < p->next->data){
            p = h;
        }
        h = h->next;
    }
    LNode *q=p->next;
    p->next=q->next;
    free(q);
}

05.试编写算法将带头结点的单链表就地逆置,所谓“就地”是指辅助空间复杂度为O(1).

void ReverseList(LinkList &L){
    LNode * p = L->next, *q;
    L->next=NULL;
    while(p){
        q = p->next;
        p->next = L->next;
        L->next = p;
        p = q;
    }
}

06.有一个带头结点的单链表L,设计一个算法使其元素递增有序。

void SortList(LinkList &L){
    LNode * p = L->next;
    while(p){
        LNode* h = L;
        while(h->next && p->data < h->next->data){
            h = h->next;
        }
        LNode *q=p->next;
        p->next = h->next;
        h->next = p;
        q = p;
    }
}

07、设在一个带表头结点的单链表中所有元素结点的数据值无序,试编写一个函数,删除表中所有介于给定的两个值(作为函数参数给出)之间的元素的元素(若存在)。

void Delet_Range(LinkList &L, ElemType lower, ElemType upper){
    LNode *h=L, *p=L->next;
    while(p){
        while(lower <= p->data && p->data <= upper){
            h->next = p->next;
            free(p)
            p=h->next;
        }else{
            h = h->next;
            p = p->next;
        }
    }
}

08.给定两个单链表,编写算法找出两个链表的公共结点。

LNode * Search_Common_Node(LinkList &A, LinkList &B){
    int lengtha = Length(A), lengthb = Length(B);
    int length;
    LinkList LongList, ShortList;
    if(lengtha > lengthb){
        length = lengtha - lengthb;
        LongList = A;
        ShortList = B
    }else{
        length = lengthb - lengtha;
        LongList = B;
        ShortList = A;
    }
    while(length--){
        LongList = LongList->next;
    }
    while(LongList){
        if(LongList == ShortList){
            return LongList;
        }
        LongList = LongList->next;
        ShortList = ShortList->next;
    }
    return NULL;
}