经典数据结构--简单链表

链表作为最为常见的数据结构,它不需要连续的存储空间,插入和删除操作可以做到o(1)。可以说是链式数据结构的基础,树,图等其实都是复杂链表。针对专门的问题,例如跳表,循环队列等,都是各个面试常遇到的问题。具体代码如下所述,主要实现了关键部分,未考虑异常(无法申请空间等)情况。

#ifndef CLINEARLINK_HHH
#define CLINEARLINK_HHH

template<typename T>
class CLinearLink;

template<typename T>
struct SNode
{
friend CLinearLink<T>;   
private:
	T m_nData;
	SNode<T>* m_pNext;
public:
	SNode();
	SNode(T data);
	~SNode();
};

template <typename T>
class CLinearLink{
private:
	// Data;
	SNode<T>* m_pHead;
public:
	// constructors;
	CLinearLink();
	~CLinearLink();
	// methods;
	CLinearLink& mInsert(const T& data);
	int mDelete(const T& data);
	bool mFind(const T& data) const;
}; 
template<typename T>
SNode<T>::SNode():
	m_pNext(NULL){}


template<typename T>
SNode<T>::SNode(T data):
	m_nData(data),m_pNext(NULL){}

template<typename T>
SNode<T>::~SNode() {}


// defination;
// constructors;
template<typename T>
CLinearLink<T>::CLinearLink():
    m_pHead(NULL){} 

template<typename T>
CLinearLink<T>::~CLinearLink(){
	SNode<T>* pTmp = NULL;
	while(m_pHead){
	       pTmp = m_pHead;
           m_pHead = m_pHead -> m_pNext;
	       delete pTmp;
	       pTmp = NULL;
	}
}
// methods;
// Insert;
template<typename T>
CLinearLink<T>& CLinearLink<T>::mInsert(const T& data){
	if(m_pHead == NULL){
         m_pHead = new SNode<T>(data);
	}else{
        SNode<T>* pTmp = m_pHead;
	    while(pTmp -> m_pNext != NULL)
	        pTmp = pTmp -> m_pNext;
		pTmp -> m_pNext = new SNode<T>(data);
	}
    return *this;	
}

// methods;
// Delete;
template<typename T>
int CLinearLink<T>::mDelete(const T& data){
	if(m_pHead == NULL)
		return -1;
	if(m_pHead -> m_nData == data){
		SNode<T>* pTmp = m_pHead -> m_pNext;
		delete m_pHead;
	    m_pHead = pTmp; 
	}else{
	    SNode<T>* pDel = NULL;	
		SNode<T>* pCur = m_pHead;
		SNode<T>* pDelNext = NULL;
           while((pCur -> m_pNext != NULL) && (pCur-> m_pNext -> m_nData != data)){
			pCur = pCur -> m_pNext;
		}
		if(pCur->m_pNext==NULL)
		    return -1;
		else{
		    pDel = pCur -> m_pNext;
            if(NULL == pDel -> m_pNext){
		        delete pDel;
				pCur->m_pNext = NULL;
            }else{
                pDelNext = pDel->m_pNext;
				delete pDel;
				pCur->m_pNext = pDelNext;
		    }
			return 1;
		}
	}
}

// methods;
// Find;
template<typename T>
bool CLinearLink<T>::mFind(const T& data) const{
	SNode<T> pTmp;
	if((m_pHead == NULL) || (m_pHead -> m_nData != data))
		return false;
	while((pTmp != NULL) && (pTmp -> m_nData != data))
        pTmp = pTmp -> m_pNext;
	if(pTmp == NULL)
		return false;
	else
		return true;
}


#endif

单链表相比数组实现的线性表来说,它不需要连续的存储空间,从而在一定意义上可以说,它更可以有效利用资源,插入和删除操作,都可以做到o(1),具体看插入和删除的目的。然而,它不能像数组那样进行随机存取,这是一大缺点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值