数据结构c++单向链表

c++单向链表

#pragma once
#include <iostream>
template<class T>
class List;

template<class T>
class Node
{
	friend class List<T>;
public:
	Node(T data) {
		this->data = data;
	}
private:
	T data;
	Node *next_node;
};

template<class T>
class List
{
public:
	List() {
		first = last = new Node<int>(0);
		size = 0;
	}
	void push_back(T data)
	{
		Node<T>* node = new Node<T>(data);
		node->next_node = nullptr;
		last->next_node = node;
		last = node;
		++size;
	}

	void push_front(T data)
	{
		Node<T>* node = new Node<T>(data);
		node->next_node = nullptr;
		node->next_node = first->next_node;
		first->next_node = node;
		++size;
	}

	T pop_back()
	{
		if (first->next_node == nullptr)
			return 0;
		auto node = first;
		auto pre_node = first;		//暂存末级节点(删除节点)的上一节点
		while (node->next_node!= nullptr)
		{
			pre_node = node;
			node = node->next_node;
		}
		T data = node->data;
		delete node;
		pre_node->next_node = nullptr;
		--size;
		return data;
	}

	T pop_front()
	{
		if (first->next_node == nullptr)
			return 0;		
		auto node = first->next_node;
		T data = node->data;
		first->next_node = node->next_node;
		delete node;
		--size;
		return data;
	}

	void delete_list(T data)
	{
		auto it = first->next_node;
		auto pre_node = first;		//暂存删除节点的上一节点
		while (it!=nullptr)
		{			
			if (it->data == data)
			{
				if (it == last)
					last = pre_node;
				pre_node->next_node = it->next_node;
				delete it;
				--size;
				break;
			}
			pre_node = it;
			it = it->next_node;
		}	
	}

	void show_list()
	{
		auto it = first->next_node;
		while (it!=nullptr)
		{
			std::cout << it->data << std::endl;
			it = it->next_node;
		}
	}

	void clear()
	{
		auto node = first->next_node;
		first->next_node = nullptr;
		Node<T>* q = nullptr;
		while (node != nullptr)
		{
			q = node->next_node;
			delete node;
			node = q;
		}
		size = 0;
	}

	//倒置链表-断开第二个节点,将第一个节点后的所有节点依次头插法插入头节点
	void reverse()
	{
		if (size<=1)		//链表为空或只有一个节点
			return;
		auto s = first->next_node;		//第一个节点
		auto p = s->next_node;		//临时节点
		last = s;
		last->next_node = nullptr;
		while (p!=nullptr)
		{		
			s = p;
			p = p->next_node;
			s->next_node = first->next_node;
			first->next_node = s;	
		}
	}
private:
	Node<T>* first;
	Node<T>* last;
	int size  =0;
};



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值