链表操作
好久不碰代码,突然上手写链表,还真是有点懵比。
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 = nullptr; //链表头为空,直接拼接上去 if (*pHead == nullptr) { *pHead = pNew; } //否则查找尾部,再拼接 else { ListNode* pNode = *pHead; while (pNode->m_pNext != nullptr) { pNode = pNode->m_pNext; } pNode->m_pNext = pNew; } } void RemoveNode(ListNode** pHead, int value) { //校验确保链表不为空 if (pHead == nullptr || *pHead == nullptr) return; //开始尝试查找目标节点 //头部节点是目标节点 ListNode* pToBeRemoved = nullptr; if ((*pHead)->m_nValue == value) { pToBeRemoved = *pHead; *pHead = (*pHead)->m_pNext; } else { //在查找到尾部前查询目标节点 ListNode* pNode = *pHead; while (pNode->m_pNext != nullptr &&pNode->m_pNext->m_nValue!=value) pNode = pNode->m_pNext; //因为不确定是查询到了结尾,还是查询到了目标节点 //所以需要判断是否是目标节点 //若是,记录删除节点,将节点前的m_pNext指向节点后面 if (pNode->m_pNext != nullptr&&pNode->m_pNext->m_nValue == value) { pToBeRemoved = pNode->m_pNext; pNode->m_pNext = pNode->m_pNext->m_pNext; } } //目标节点未找到,释放内存 if (pToBeRemoved == nullptr) { delete pToBeRemoved; pToBeRemoved = nullptr; } }