线性表(顺序表)有两种存储方式:链式存储和顺式存储,顺式存储如数组,其内存连续分配,且是静态分配。链式存储,内存是不连续的,且是动态分配。前一个元素存储数据,后一个元素存储指向下一个节点的指针。
如图所示为单向链表。
链表结构:
typedef LinkNode
{
int m_nValue; //节点中存储的值
LinkNode* m_pNext; //节点存储的指针,指向链表的下一个节点
};
在链表的结尾处加入一个节点(注意第一个参数,定义了一个指向指针的指针,因为当我们建立一个新的链表时,首节点的第一个元素就是头指针)。
void AddToTail(ListNode**pHead,int value)
{
//首先创建这个要插入的节点,节点需要包括数据和指向空的指针(在节点末尾处指针为nullptr)
LinkNode* pNew;
pNew->m_nValue=value;
pNew->m_pNext=nullptr;
//然后判断该链表的首节点是否为空
if(*pHead->m_pNext==nullptr) //若首节点没有下一个指向,则表示首节点即为尾节点,将首节点的下
//一个指针指向新建的节点。
*pHead=pNew;
else
{
LinkNode* pNode=*pHead; //如果首节点不为空,则往下找到尾节点,尾节点的指
while(pNode->m_pNext!=nullptr) //针为nullptr,将尾结点的指针指向pNext。
{
pNode=pNode->m_pNext;
}
pNode->m_pNext=pNext;
}
}
删除链表中存储某个值的节点
void RemoveNode(LinkNode**pHead,int value)
{
//首先判断首节点是否为空
if(*pHead=nullptr||pHead=nullptr)
return;
LinkNode*pToBeDelete=nullptr;
//判断首节点是否为要删除的元素
if((*pHead)->m_nValue==value)
{
pToBeDelete=*pHead;
*pHead=(*pHead)->m_pNext;
}
else
{
LinkNode *pNode=*pHead;
while(pNode->m_pNext!=nullptr&&pNode->m_nValue!=value)
pNode->m_Next=pNode->m_pNext-> ;
if(pNode->m_pNext!=nullptr&&pNode->m_nValue==value)
{
pToBeDeleted=pNode->m_pNext;
pNode->m_Next=pNode->m_pNext->m_pNext;
}
}
if(pToBeDeleted!=nullptr)
{
delete pToBeDeleted;
pToBeDeleted=nullptr;
}
}