剑指offer--(2.3.4)链表找到第一个含某值得结点并删除该结点
1.给一个链表的末尾加一个结点,
2.链表中找到第一个含某值得结点并删除该结点。
struct ListNode
{
int m_nValue;
ListNode* m_pNext;
};
第一小问解答代码如下:
//给该链表的末尾中添加一个节点
void AddToTail(ListNode** pHead,int value)
{
//定义一个新节点存放新值
ListNode* pNew = new ListNode();
pNew->m_nValue = value;
pNew->m_pNext = NULL;
//如果原来的链表为空,直接将新节点设为头结点
if(*pHead == NULL)
{
*pHead = pNew;
}
else
{
//否则找到链表的末尾位置为pNode,然后赋值
ListNode* pNode = *pHead;
while(pNode->m_pNext != NULL)
{
pNode = pNode->m_pNext;
}
pNode->m_pNext = pNew;
}
}
第二问代码如下:
//找到第一个含有某值得节点并删除该节点
void RemoveNode(ListNode** pHead,int value)
{
/*1.先判断安全指针
2.判断头结点的值是不是该值,是的话,将头结点的next赋给头结点
3.否则从头结点开始找该值得节点,如果找到了,将该节点的next赋值给该节点
4.刚才讲要删除的值赋给变量pToBeDeleted,如果该变量不为空,则删除节点,并置空防止野指针
*/
//1
if(pHead == NULL && *pHead ==NULL )
{
return ;
}
//2
ListNode* pToBeDeleted = NULL;
if((*pHead)->m_nValue == value)
{
pToBeDeleted = *pHead;
*pHead = (*pHead) -> m_pNext;
}
else
{
//3
ListNode* pNode = *pHead;
while(pNode->m_pNext != NULL && pNode->m_pNext->m_nValue != value)
pNode = pNode -> m_pNext;
if(pNode->m_pNext != NULL && pNode -> m_pNext->m_nValue == value)
{
pToBeDeleted = pNode->m_pNext;
pNode->m_pNext = pNode->m_pNext->m_pNext;
}
}
//4
if(pToBeDeleted != NULL)
{
delete pToBeDeleted;
pToBeDeleted = NULL;
}
}