简单链表实现-C++笔记

定义Node节点,使用泛型

template <class T>
struct LinkedNode {
	LinkedNode() :value(0), next(NULL) {}
	LinkedNode(T v, LinkedNode* node) : value(v), next(node) {}
	~LinkedNode() {}
	T value;
	LinkedNode* next;
};

链表的类定义


template <class T>
class LinkedList {
public:
	LinkedList() :dummyHead(NULL), tail(NULL), maxSize(0) {}
	void initLinkedList() {
		dummyHead = new LinkedNode<T> ();
		assert(dummyHead != NULL);
	}
	bool add(int index, const T& v);
	bool addFirst(const T& v);
	bool addLast(const T& v);

	bool remove(int index, T& v);
	bool removeFirst(T& v);
	bool removeLast(T& v);

	int getSize() { return maxSize; }
	bool isEmpty() { return maxSize == 0; }

	template <class T>
	friend std::ostream& operator<< (std::ostream& out, LinkedList<T>*& list);

private:
	LinkedNode<T>* dummyHead;
	LinkedNode<T>* tail;
	int maxSize;
};
template <class T>
bool LinkedList<T>::add(int index, const T& v) {
	if (index < 0 || index > maxSize) {
		return false;
	}
	if (dummyHead == NULL) {
		initLinkedList();
	}
	LinkedNode<T>* prev = dummyHead;
	for (int i = 0; i < index; i++) {
		prev = prev->next;
	}
	prev->next = new LinkedNode<T>(v, prev->next);
	maxSize++;
	return true;
}

template <class T>
bool LinkedList<T>::addFirst(const T& v) {
	return add(0, v);
}

template <class T>
bool LinkedList<T>::addLast(const T& v) {
	return add(maxSize, v);
}


template <class T>
std::ostream& operator<< (std::ostream& out, LinkedList<T>*& list) {
	if (list == NULL || list->maxSize == 0) {
		return out;
	}
	out << "[ ";
	LinkedNode<T>* cur = list->dummyHead->next;
	for (int i = 0; i < list->maxSize; i++) {
		out << cur->value << " ";
		cur = cur->next;
	}
	out << "]" << std::endl;
	return out;
}


template <class T>
bool LinkedList<T>::remove(int index, T& v) {
	if (index < 0 || index > maxSize) {
		return false;
	}
	LinkedNode<T>* prev = dummyHead;
	for (int i = 0; i < index - 1; i++) {
		prev = prev->next;
	}
	LinkedNode<T>* cur = prev->next;
	prev->next = cur->next;
	v = cur->value;
	delete cur;
	maxSize--;
	return true;
}

template <class T>
bool LinkedList<T>::removeFirst(T& v) {
	return remove(0, v);
}

template <class T>
bool LinkedList<T>::removeLast(T& v) {
	return remove(maxSize, v);
}

这里的tail暂时不用到,也就没有定义了,如果需要链表实现队列,可以对此类进行修改

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值