单链表删除指定元素

我的职业是看店铺的 2011-05-30 02:50:15
我在单链表类中定义了head,tail指针,现在我想实现删除单链表中指定的元素,重复出现的也需要删除,我老是想不出怎么写,自己写的却输出不正确,把指定元素后面的给删除了。
大家让我偷懒下吧,这个函数,我想了好久!
定义的类如下

template<typename T>
class Node
{
public:
T element;
Node<T> *next;

Node() //构造函数
{
next = NULL;
}

Node(T element)
{
this->element = element;
next = NULL;
}
};

template<typename T>
class LinkedList
{
public:
LinkedList(); //创建一个默认的链表
void addFirst(T element);
void addLast(T element);
T getFirst();
T getLast();
T removeFirst() throw(runtime_error);
T removeLast();
void add(T element); //在链尾添加元素
void add(int index, T element); //在指定位置添加元素
void clear();
bool contains(T element); //如果列表中包含指定元素,则返回为真
T get(int index); //返回列表中指定的元素
int indexOF(T element); //返回列表中第一个匹配元素的节点下标
bool isEmpty();
int lastIndexOF(T element); //返回列表中最后一个匹配元素的节点下标
void remove(T element);
int getSize();
T removeAt(int index); //删除指定位置元素,并将其返回
T set(int index, T element); //将指定位置元素设置为新值,并返回原址

private:
Node<T> *head, *tail;
int size;
};

函数如下

template<typename T>
void LinkedList<T>::remove(T element)
{//从列表中删除指定元素
if(size == 0)
throw runtime_error("链表长度为0\n");
else
{
Node<T> *temp = head;
for(int i = 0; i < size - 1; i++)
{
if(temp->element == element)
{
temp = temp->next->next;
--size;
}
else
temp = temp->next;
}
if(temp->element == element)
{
removeLast();
--size;
}
}
}

这个函数想不出如何用单链表弄,大家帮忙下,我真的想早点解决掉!

积分献上,谢谢了!
...全文
767 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
谢谢大哥,我就是想重复情况下的解决
newfarmerchi 2011-05-30
  • 打赏
  • 举报
回复

//如果单链表有重复出现的,也可这样,just try!
template<typename T>
void LinkedList<T>::remove(T element)
{//从列表中删除指定元素
if(size == 0)
throw runtime_error("链表长度为0\n");
else
{
Node<T> *temp , *pre;
bool flag;
for(int i = 0; i < size ; i++)
{
temp=head;
flag=0;//看是否在一次while中存在有与element相同的node;
while(element!=temp->element && temp->next!=NULL) //查找要删除的结点
{
pre=temp; //记录
temp=temp->next; //temp后移一个结点
}

if(element==temp->element)
{
flag=1;
if(temp==head)//如果是头部
{
head=head->next;
}
else
{
pre->next=temp->next;//其他情况
}
delete temp;//不知可否
--size;
}
if (!flag)
{
break;//没有与element相同的node
}
}
}
}






newfarmerchi 2011-05-30
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 iamhby 的回复:]
引用 4 楼 newfarmerchi 的回复:
C/C++ code
else
{
Node<T> *temp = head, *pre;
while(element!=temp->element && temp->next!=NULL) //查找要删除的结点
{
pre=temp; //记录
temp=temp->next; //temp后移一个结点
}

……
[/Quote]
temp的确只记录了一个结点,如果能正确的删除一个节点,那么删除多个就
不是问题了。
由于不知道add(int index, T element); //在指定位置添加元素
是如何实现的,可能添加的元素就是不重复的。这里给出的代码只能是
一个大意。
pre->next=temp->next;//其他情况
是指删除其他节点(不是头节点)。
delete temp;//不知可否
是指原代码中没有delete,不知LZ的想法,delete temp;只是供
LZ参考。
thanks!
帆满 2011-05-30
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 newfarmerchi 的回复:]
C/C++ code
else
{
Node<T> *temp = head, *pre;
while(element!=temp->element && temp->next!=NULL) //查找要删除的结点
{
pre=temp; //记录
temp=temp->next; //temp后移一个结点
}

if(element==temp->element)
{
if(temp==head)//如果是头部
{
head=head->next;
}
else
{
pre->next=temp->next;//其他情况
}
delete temp;//不知可否
--size;
}
else
{
cout<<"not found\n";
}



[/Quote]
好像行不通吧 ,算来算去temp也只记录了一个结点,还有
  else
{
pre->next=temp->next;//其他情况
}
delete temp;//不知可否

这是什么意思??/
  • 打赏
  • 举报
回复
3楼 nightelve 英俊的你
名字和我朋友一样,昨天晚上我还想着这个的时候和一个朋友聊天,还刚好也叫同样的名字!呵呵
有没有Girl friend呢?介绍个。
qq120848369 2011-05-30
  • 打赏
  • 举报
回复
主要是head你也用来存放数据了,编码复杂度得到了空前的提升。

1.从head开始扫描,遇到NULL结束扫描,如果head==NULL同样可以马上结束,所以这一点OK。
2.如果current不等于指定元素n,current=current->next;
3.如果current等于n,则要发生删除动作,删除一个结点有难度么? 当然没有,为什么没难度?
因为你应该在类中实现一个删除指定结点的函数,removeElem(Node *),删除逻辑都转移到这个
函数中去。

删除前你就应该记录下current->next是什么,因为那将是你搜索的下一个结点,也就是接下来的
current=current->next;

逻辑就是这样的,复杂的东西都在removeElem里,包括你删除的是head(1,判断head==tail 2,temp=head;head=head->next;delete temp;3,如果1中为true,tail=NULL;),删除的是tail(1,判断head==tail,2,temp=tail;tail=tail->pre;delete temp;3,如果1中为true,head=NULL.),删除非head非tail(普通删除即可,因为起码有3个结点了~)。 removeElem当然不会包括删除NULL的情况,因为remove(T elem)上边3个步骤里保证一定是传入一个非NULL结点。 如果你考虑把removeElem(Node *)当做一个接口提供给用户,那么必须处理NULL的情况。
qq120848369 2011-05-30
  • 打赏
  • 举报
回复
主要是head你也用来存放数据了,编码复杂度得到了空前的提升。

1.从head开始扫描,遇到NULL结束扫描,如果head==NULL同样可以马上结束,所以这一点OK。
2.如果current不等于指定元素n,current=current->next;
3.如果current等于n,则要发生删除动作,删除一个结点有难度么? 当然没有,为什么没难度?
因为你应该在类中实现一个删除指定结点的函数,removeElem(Node *),删除逻辑都转移到这个
函数中去。

删除前你就应该记录下current->next是什么,因为那将是你搜索的下一个结点,也就是接下来的
current=current->next;

逻辑就是这样的,复杂的东西都在removeElem里,包括你删除的是head(1,判断head==tail 2,temp=head;head=head->next;delete temp;3,如果1中为true,tail=NULL;),删除的是tail(1,判断head==tail,2,temp=tail;tail=tail->pre;delete temp;3,如果1中为true,head=NULL.),删除非head非tail(普通删除即可,因为起码有3个结点了~)。 removeElem当然不会包括删除NULL的情况,因为remove(T elem)上边3个步骤里保证一定是传入一个非NULL结点。 如果你考虑把removeElem(Node *)当做一个接口提供给用户,那么必须处理NULL的情况。
newfarmerchi 2011-05-30
  • 打赏
  • 举报
回复

template<typename T>
void LinkedList<T>::remove(T element)
{//从列表中删除指定元素
if(size == 0)
throw runtime_error("链表长度为0\n");
else
{
Node<T> *temp = head, *pre;
while(element!=temp->element && temp->next!=NULL) //查找要删除的结点
{
pre=temp; //记录
temp=temp->next; //temp后移一个结点
}

if(element==temp->element)
{
if(temp==head)//如果是头部
{
head=head->next;
}
else
{
pre->next=temp->next;//其他情况
}
delete temp;//不知可否
--size;
}
else
{
cout<<"not found\n";
}



/*
for(int i = 0; i < size - 1; i++)
{
if(temp->element == element)
{
temp = temp->next->next;
--size;
}
else
temp = temp->next;
}
if(temp->element == element)
{
removeLast();
--size;
}*/
}
}





nightelve 2011-05-30
  • 打赏
  • 举报
回复
template<typename T>
void LinkedList<T>::remove(T element)
{
if (!head)
return;

while (head && head->element == element)
{
Node<T>* next = head->next;
delete head;
head = NULL;
--size;
assert(size >= 0);

if (!next)
return;

head = next;
}


Node<T>* last = head;
Node<T>* current = head->next;

while(current)
{
if (current->element == element)
{
last->next = current->next;
delete current;
current = last->next;
--size;
assert(size >= 0);
continue;
}
last = current;
current = current->next;
}
}
  • 打赏
  • 举报
回复
自己顶下,抽根烟再睡,最近还要复习园林畜牧!
  • 打赏
  • 举报
回复
肚子饿的不行了,睡觉去!!

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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