單鏈表基本操作(刪除連結串列中最大元素)
題目描述:
設計一個演算法,刪除一個單鏈表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;
}
習題拓展:
如果連結串列中元素的最大值不唯一,該如何實現呢???請小夥伴們動動自己的聰明的大腦想想哦。