删除链表的节点有很多的方法,有普通的和简单的
由于函数需要传入头结点和删除的节点,我们可以将删除节点Del的下一个节点Next删除
在删除前,将Next节点的值赋值给Del,间接的实现了删除
注意:如果删除的情况是尾节点(Del->m_pnext == NULL),则还需要从头遍历进行删除
综合情况下,该算法的时间复杂度为O(1)
代码的实现:
#include<iostream>
using namespace std;
struct ListNode
{
int _value;
ListNode* next;
};
void DeleteNode(ListNode** pListHead, ListNode* pToBeDelete)
{
if (!pListHead || !pToBeDelete)//如果头结点为空或者将要删除的节点为空,就返回
{
return;
}
if (pToBeDelete->next != NULL)
{
ListNode* pNext = pToBeDelete->next;
pToBeDelete->_value = pNext->_value;
pToBeDelete->next = pNext->next;
delete pNext;
pNext = NULL;
}
else if (*pListHead == pToBeDelete)
{
delete pToBeDelete;
pToBeDelete = NULL;
*pListHead = NULL;
}
else
{
ListNode* pNode = *pListHead;
while (pNode->next != pToBeDelete)
{
pNode = pNode->next;
}
pNode->next = NULL;
delete pToBeDelete;
pToBeDelete = NULL;
}
}