单链表基本操作(删除链表中最大元素)

题目描述:

设计一个算法,删除一个单链表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;
}
 

习题拓展:

如果链表中元素的最大值不唯一,该如何实现呢???请小伙伴们动动自己的聪明的大脑想想哦。

猜你喜欢

转载自blog.csdn.net/DreamTrue1101/article/details/82970180