链表中删除首个值为t的节点、所有值为t的节点

整个结构参考https://blog.csdn.net/morewindows/article/details/7186471,只是对删除节点部分进行了重写。

节点结构如下:

template<class T>
struct Node
{
	T val;
	Node *next;
	Node(T t)
	{
		this->val = t;
		this->next = nullptr;
	}
};

对单链表进行封装

template<class T>
class slist
{
public:
	slist();
	~slist();
	void push_front(T t);
	bool remove(T&t);
	bool removeAll(T&t);
	bool find(T&t);
	int size();
	void clear();
	void dis();
private:
	int slistcount;
	Node<T> *mhead;
};

删除首个置为t的节点

template<class T>
bool slist<T>::remove(T &t)
{
	Node<T>*pre = mhead, *p = mhead;
	while (p != nullptr)
	{
		if (p->val == t)
		{
			if (p != pre)//此处要判断是否为头结点,如果是将头结点置空
				pre->next = p->next;
			else
				mhead = p->next;
			delete p;
			slistcount--;
			return true;
		}
		pre = p;
		p = p->next;
	}
	return false;
}

删除所有值为t的节点

template<class T>
bool slist<T>::removeAll(T&t)
{
	Node<T>*pre = mhead, *p = mhead;
	int count = 0;
	while (p != nullptr)
	{
		if (p->val == t)
		{
			if (p == pre)
			{
				pre = pre->next;
				delete p;
				mhead = pre;
 			}				
			else
			{
				pre->next = p->next;
				delete p;
			}
			p = pre;
			count++;
			slistcount--;
		}
		else
		{
			pre = p;
			p = p->next;
		}
	}
	return count;
}

测试:

int main()
{
	slist<int> s;
	int a = 4;
	s.push_front(4);
	s.push_front(6);
	s.push_front(7);
	s.push_front(8);
	s.push_front(4);
	s.push_front(4);
	s.removeAll(a);
	s.dis();
   	getchar();
	return 0;
}

输出:

8
7
6


猜你喜欢

转载自blog.csdn.net/znzxc/article/details/80892962
今日推荐