删除单链表中的最大值结点,我的方法笨,望指点!

LENOVO_ 2010-01-01 11:19:26
有个单链表,要求删除里面的最大值。

我的思路:

1、先找出这个最大值的位置;
2、删除它。

我不会用指针,我用下标来完成。
1、先找到这个最大值的下标,假如从第一个结点开始编号0。
2、找到这个最大值所在结点的前一个结点的指针r;
3、用 q=r->next; r->next=q->next; delete q; 的方法删除这个最大结点。

假如找到的最大结点就是第一个结点,需要特殊处理一下。我在这里当时遇到了点麻烦,后来改过来了。

我的代码:


int deletemax(LinkList *&L)
{
int i=0,j=0,max=L->date;
LinkList *p=L,*q=NULL,*r=NULL;
if(p==NULL) //如果链表为空,即返回
return -1;
while(p!=NULL)
{
if(max<p->date)
{
max=p->date;
i=j;
}
j++;
p=p->next;
}
if(i==0) //如果找到的是第一个结点,就删除它
{
q=L;
L=q->next;
delete q;
return max;
}
r=L;
j=0;
while(j<i-1 && r!=NULL) //重新开始找最大结点的前一个位置的指针
{
j++;
r=r->next;
}
if(r==NULL) //这个感觉没有必要,还是写上吧。
return -1;
else
{
q=r->next;
if(q==NULL) //这个感觉也没有必要,写上放心点。
return -1;
r->next=q->next;
delete q;
return max;
}
}


个人感觉方法很笨拙,我对指针掌握的不好,不知道怎样不用下标来完成这个功能。

希望能给出个代码。谢谢!
...全文
1112 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ivgwt 2010-01-02
  • 打赏
  • 举报
回复
Node *pre=NULL, *p=head;
Node *pMax=NULL;
int max = -7fffffff;
while ( p!=NULL){
if (p->data > max)
pMax = pre;
pre = p;
p = p->next;
}

if (pMax == NULL)
删除头结点;
else
删除pMax后面那个节点;
LENOVO_ 2010-01-02
  • 打赏
  • 举报
回复
谢谢 ivapple 这么晚了还回我贴,谢谢!

初看你的 int max = -7fffffff; 还真把我困惑了一下。

当时我想把 最小值 直接设为 -2147483648;

结果编译报错:
warning C4146: 一元负运算符应用于无符号类型,结果仍为无符号类型

我查了一下,如果我要把一个 int 类型的变量赋最小值,有两种方法:

int max=-2147483647-1;

int max=INT_MIN;

你的 -7fffffff 应该是 -2147483647

学习了!再次感谢!
ivgwt 2010-01-02
  • 打赏
  • 举报
回复
嗯,是我一时疏忽,写成-0x7fffffff应该就对了。
不过INT_MIN更好用。
呵呵,互相学习,不用客气!

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧