/* 题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间内删除该节点。 */ /* 思路: 将要删除的节点的下一个节点的value和next复制过来,删除下一个节点。 考虑两种特殊情况: 节点为尾结点,则需要从头遍历。 节点既是尾结点也是头结点,需要将头节点指向的内容置为空。 */ struct ListNode{ int value; ListNode* next; }; void DeleteNode(ListNode** pListHead, ListNode* pToBeDeleted){ if(!pListHead || !pToBeDeleted){ throw("invalid parameters"); } //要删除的节点既是头结点,又是尾结点 if(*pListHead== pToBeDeleted && !pToBeDeleted->next){ *pListHead = nullptr; delete pToBeDeleted; pToBeDeleted = nullptr; }else if(!pToBeDeleted->next){//要删除的节点是尾结点if ListNode* pNode = *pListHead; while(!pNode->next->next){ pNode = pNode->next; } pNode->next = nullptr; delete pToBeDeleted; pToBeDeleted = nullptr; }else{ ListNode *nextNode = pToBeDeleted->next; pToBeDeleted->value = nextNode->value; pToBeDeleted->next = nextNode->next; delete nextNode; nextNode = nullptr; } }