c++单项链表

#pragma once

template<typename T>
struct LinkNode
{
	T data;
	LinkNode<T>* pNext;
};

template<typename T>
class Link
{
public:
	Link();
	~Link();


	//头部插入节点
	void push_head(const T& val);

	//在指定位置插入节点
	void insert(const T& val, int pos);

	//删除所有数据
	void DeleteAll();

	//查找某元素并返回其节点地址
	LinkNode<T>* Find(const T& val);
	//按元素删除节点
	void DeleteElem(const T& val);

	//尾部删除
	void DeleteLast();

	//第一个节点删除
	void DeleteFirst();

	//链表反转
	void Reserve();

	//打印链表
	void Print();

private:
	LinkNode<T>* pHead;
};

template<typename T>
Link<T>::Link()
{
	pHead = new LinkNode<T>;
	pHead->pNext = nullptr;
}

template<typename T>
Link<T>::~Link()
{
	DeleteAll();
	delete pHead;
	pHead = nullptr;
}

template<typename T>
void Link<T>::push_head(const T& val) 
{
	LinkNode<T>* node = new LinkNode<T>();
	node->data = val;
	node->pNext = pHead->pNext;
	pHead->pNext = node;
}

template<typename T>
void Link<T>::insert(const T& val, int pos)
{
	LinkNode<T>* newNode = new LinkNode<T>();
	newNode->data = val;

	LinkNode<T>* node = pHead;
	for(int i = 1; i < pos; i++)
	{
		if (node->pNext == nullptr)
			break;
		node = node->pNext;
	}

	newNode->pNext = node->pNext;
	node->pNext = newNode;
}

template<typename T>
void Link<T>::DeleteAll()
{
	while (pHead->pNext) 
	{
		LinkNode<T>* pNode = pHead->pNext;
		pHead->pNext = pHead->pNext->pNext;
		delete pNode;
	}
}


template<typename T>
LinkNode<T>* Link<T>::Find(const T& val)
{
	LinkNode<T>* pNode = pHead->pNext;
	while (pNode)
	{
		if (pNode->data == val) 
		{
			return pNode;
		}
		pNode = pNode->pNext;
	}

	return nullptr;
}


template<typename T>
void Link<T>::DeleteElem(const T& val)
{
	LinkNode<T>* pNode = pHead;
	while (pNode->pNext)
	{
		if (pNode->pNext->data == val)
		{
			LinkNode<T>* delNode = pNode->pNext;
			pNode->pNext = delNode->pNext;
			delete delNode;
		}
		else 
		{
			pNode = pNode->pNext;
		}
	}
}

template<typename T>
void Link<T>::DeleteLast()
{
	LinkNode<T>* pNode = pHead;
	if (pNode->pNext == nullptr) 
		return;

	while (pNode->pNext->pNext)
	{
		pNode = pNode->pNext;
	}

	LinkNode<T>* delNode = pNode->pNext;
	pNode->pNext = nullptr;
	delete delNode;
}

template<typename T>
void Link<T>::DeleteFirst()
{
	if (pHead->pNext)
	{
		LinkNode<T>* delNode = pHead->pNext;
		pHead->pNext = delNode->pNext;
		delete delNode;
	}
}

template<typename T>
void  Link<T>::Reserve()
{
	LinkNode<T>* pNode = pHead->pNext;
	if (pNode == nullptr) 
		return;

	while (pNode->pNext)
	{
		LinkNode<T>* node = pNode->pNext->pNext;
		pNode->pNext->pNext = pHead->pNext;
		pHead->pNext = pNode->pNext;
		pNode->pNext = node;	
	}
}

template<typename T>
void  Link<T>::Print()
{
	LinkNode<T>* pNode = pHead->pNext;
	while (pNode)
	{
		std::cout << pNode->data << std::endl;
		pNode = pNode->pNext;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值