链表作为最为常见的数据结构,它不需要连续的存储空间,插入和删除操作可以做到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),具体看插入和删除的目的。然而,它不能像数组那样进行随机存取,这是一大缺点。