定義結(jié)點(diǎn)
struct ListNode
{
int m_nValue;
ListNode* m_pnext;
};
創(chuàng)建鏈表結(jié)點(diǎn)
ListNode* CreateListNode(int value)
{
ListNode* pNode = new ListNode();
pNode->m_nValue = value;
pNode->m_pNext = nullptr;
return pNode;
}
連接鏈表各結(jié)點(diǎn)
void ConnectListNodes(ListNode* pCurrent,ListNode* pNext)
{
if(pCurrent == nullptr)
{
cout<<"Error to connect two nodes!"<<endl;
exit(1);
}
pCurrent->m_pNext = pNext;
}
打印鏈表結(jié)點(diǎn)的值
void PrintListNode(ListNode* pNode)
{
if(pNode == nullptr)
{
cout<<"Error to print node, the node is nullptr !"<<endl;
}
else
{
cout<<"The value in node is "<<pNode->m_nValue<<endl;
}
}
打印整個(gè)鏈表中的值
void PrintList(ListNode* pHead)
{
cout<<"Print list starts:"<<endl;
ListNode* pNode = pHead;
while(pNode!=nullptr)
{
cout<<pNode->m_nValue<<endl;
pNode = pNode->m_pNext;
}
cout<<"Print list ends."<<endl;
}
刪除整個(gè)鏈表
void DestroyList(ListNode* pHead)
{
ListNode* pNode = pHead;
while(pNode!=nullptr)
{
pHead = pHead->m_pNext;
delete pNode;
pNode = pHead;
}
}
在鏈表尾部加入結(jié)點(diǎn)
void AddToTail(ListNode ** pHead,int value)
{
ListNode* pNew = new ListNode();
pNew->m_nValue = value;
pNew->m_pNext = nullptr;
if(*pHead == nullptr) //判斷如果此時(shí)鏈表為空,則插入的節(jié)點(diǎn)為頭節(jié)點(diǎn)
{
*pHead = pNew;
}
else
{
ListNode* pNode = *pHead;
while(pNode->m_pNext != nullptr)
pNode = pNode->m_pNext;
pNode->m_pNext = pNew;
}
}
特別注意,pHead是一個(gè)指向指針的指針,當(dāng)我們往一個(gè)空鏈表中插入結(jié)點(diǎn)時(shí),新插入的節(jié)點(diǎn)就是鏈表的頭指針。由于此時(shí)會(huì)改動(dòng)頭指針,因此必須把pHead參數(shù)設(shè)為指向指針的指針,否則出了這個(gè)函數(shù)pHead仍舊是一個(gè)空指針。
在鏈表中找到第一個(gè)含有某值的節(jié)點(diǎn)并刪除此節(jié)點(diǎn)
void RemoveNode(ListNode **pHead,int value)
{
if(pHead == nullptr || *pHead == nullptr)
return;
ListNode* pToBeDeleted = nullptr;
if((*pHead)->m_nValue == value)
{
pToBeDeleted = *pHead;
*pHead = (*pHead)->m_pNext;
}
else
{
ListNode* pNode = *pHead;
while(pNode->m_pNext != nullptr && pNode->m_pNext->m_nValue != value)
pNode = pNode->m_pNext;
if(pNode->m_pNext !=nullptr && pNode->m_pNext->m_nValue == value) //找到value值的上一個(gè)節(jié)點(diǎn)
{
pToBeDeleted = pNode->m_pNext;
pNode->m_pNext = pNode->m_pNext->m_pNext;
}
}
if(pToBeDeleted != nullptr)
{
delete pToBeDeleted;
pToBeDeleted = nullptr;
}
}
總結(jié):考慮情況要全面。