双向链表实现C++

typedef struct DoubleListNode{
	int val;
	DoubleListNode* next;
	DoubleListNode* pre;
	DoubleListNode(int value, DoubleListNode* n, DoubleListNode* p) :val(value), next(n), pre(p){}
};

class MyLinkedList{
public:
	DoubleListNode* root;
	DoubleListNode* trail;
	int size;

	MyLinkedList()//构造函数 初始化列表 动态数组的const len字段只能用初始化列表来初始化
	{
		root = nullptr;
		trail = nullptr;
		size = 0;
	}

	//通过索引得到节点
	int get(int index)//2
	{
		int temp = 0;
		DoubleListNode* cur = root;
		while (cur != nullptr)
		{
			if (temp == index)
			{
				return cur->val;
			}
			cur = cur->next;
			temp++;
		}
		return -1;
	}

	void addAtHead(int val)
	{
		if (root != nullptr)
		{
			DoubleListNode* newNode = new DoubleListNode(val, root, nullptr);
			root->pre = newNode;
			root = newNode;
		}
		else
		{
			root = new DoubleListNode(val, nullptr, nullptr);
			trail = root;
		}
		size++;
	}

	void addAtTail(int val)
	{
		if (trail != nullptr)
		{
			DoubleListNode* newNode = new DoubleListNode(val, nullptr, trail);
			trail->next = newNode;
			trail = newNode;
		}
		else
		{
			trail = new DoubleListNode(val, nullptr, nullptr);
			root = trail;
		}
		size++;
	}

	void addAtIndex(int index, int val)
	{
		if (index<=0)
		{
			addAtHead(val);
			return;
		}
		if (index == size)
		{
			addAtTail(val);
			return;
		}

		int temp = 0;
		DoubleListNode* pre = nullptr;
		DoubleListNode* cur = root;
		while (cur != nullptr)
		{
			if (temp == index)
			{
				DoubleListNode* newNode = new DoubleListNode(val, cur, pre);
				if (pre != nullptr)
				{
					pre->next = newNode;
				}
				cur->pre = newNode;
				size++;
				return;
			}
			pre = cur;
			cur = cur->next;
			temp++;
		}
	}

	//移除给定索引处的节点
	void deleteAtIndex(int index)
	{
		int temp = 0;
		DoubleListNode* pre = nullptr;
		DoubleListNode* cur = root;
		if (index == 0)
		{
			DoubleListNode* old = root;
			root = root->next;
			if (root != nullptr)
			{
				root->pre = nullptr;
			}
			delete old;
			size--;
			return;
		}
		if (index == size-1)
		{
			DoubleListNode* old = trail;
			trail = trail->pre;
			if (trail != nullptr)
			{
				trail->next = nullptr;
			}
			delete old;
			size--;
			return;
		}
		while (cur != nullptr)
		{
			if (temp == index)
			{
				DoubleListNode* old = cur;
				if (pre != nullptr)
				{
					pre->next = cur->next;
				}
				if (cur->next != nullptr)
				{
					cur->next->pre = pre;
				}
				delete old;
				size--;
				return;
			}
			pre = cur;
			cur = cur->next;
			temp++;
		}
	}
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值