1. 程式人生 > >單鏈表基本操作(刪除連結串列中最大元素)

單鏈表基本操作(刪除連結串列中最大元素)

題目描述:

設計一個演算法,刪除一個單鏈表L中元素值最大的節點(假設這樣的節點唯一)

解題思路:

在單鏈表中刪除一個節點先要找到它的前驅節點,用指標p掃描整個單鏈表,pre指向節點p的前驅節點,在掃描時用maxp指向data域值最大的節點,maxpre指向maxp所指節點的前驅節點,當連結串列掃描完畢後,通過maxpre所指節點刪除其後的節點。

題解基礎:

利用單鏈表基本操作實現

C++程式碼實現:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef struct LNode
{
    int data;
    struct LNode *next;
} LinkNode;
void CreateListR(LinkNode *&L,int a[],int n)       // 尾插法
{
    LinkNode *s,*r;
    L=(LinkNode *)malloc(sizeof(LinkNode));
    r=L;
    for(int i=0; i<n; i++)
    {
        s=(LinkNode *)malloc(sizeof(LinkNode));
        s->data=a[i];
        r->next=s;
        r=s;
    }
    r->next=NULL;
}
void delmaxnode(LinkNode *&L)    //  具體實現函式
{
    LinkNode *p=L->next,*pre=L,*maxp=p,*maxpre=pre;  //用p掃描整個單鏈表,pre是始終指向前驅節點
    while(p!=NULL)
    {
        if(maxp->data<p->data)    // 若找到一個更大的節點
        {
            maxp=p;      //  更新maxp
            maxpre=pre;  //  更新pre
        }
        pre=p;       // p,pre同步後移一個節點
        p=p->next;
    }
    maxpre->next=maxp->next;   //   刪除maxp節點
    free(maxp);         //   釋放maxp節點
}
void DispList(LinkNode *L)      //  輸出函式
{
    LinkNode *p=L->next;
    while(p!=NULL)
    {
        printf("%d ",p->data);
        p=p->next;
    }
    printf("\n");
}
int main()
{
    int a[1000],n;
    scanf("%d",&n);
    for(int i=0; i<n; i++)
        scanf("%d",&a[i]);
    LinkNode *L;
    CreateListR(L,a,n);
    delmaxnode(L);
    DispList(L);
    return 0;
}
 

習題拓展:

如果連結串列中元素的最大值不唯一,該如何實現呢???請小夥伴們動動自己的聰明的大腦想想哦。