题目描述:
设计一个算法,删除一个单链表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;
}
习题拓展:
如果链表中元素的最大值不唯一,该如何实现呢???请小伙伴们动动自己的聪明的大脑想想哦。