题目描述
- 给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点,返回新链表的头节点;
- PS:本题无提交
算法分析
- 若被删除的节点为第一个节点,则直接将头节点指向下一个节点;
- 若被删除的节点不是第一个节点,则沿着链表遍历每一个节点,直到找到该节点currNode,使preNode->next = currNode->next,并释放该节点。
提交代码:
class Solution{
public:
ListNode* DeleteNode(ListNode* pListHead, ListNode* pToBeDeleted)
{
if (!pListHead || !pToBeDeleted)
return pListHead;
/*如果被删除节点为第一个节点*/
if (pToBeDeleted == pListHead)
{
pListHead = pListHead->next;
delete pToBeDeleted;
pToBeDeleted = nullptr;
}
else
{
ListNode* preNode = pListHead;
ListNode* currNode = pListHead;
while (currNode)
{
if (currNode == pToBeDeleted)
{
preNode->next = currNode->next;
delete pToBeDeleted;
pToBeDeleted = nullptr;
break;
}
else
{
preNode = currNode;
currNode = currNode->next;
}
}
}
return pListHead;
}
};
测试代码:
// ====================测试代码====================
ListNode* Test(ListNode* pListHead, ListNode* pNode)
{
printf("The original list is: \n");
PrintList(pListHead);
printf("The node to be deleted is: \n");
PrintListNode(pNode);
Solution s;
pListHead = s.DeleteNode(pListHead, pNode);
printf("The result list is: \n");
PrintList(pListHead);
return pListHead;
}
// 链表中有多个结点,删除中间的结点
void Test1()
{
ListNode* pNode1 = CreateListNode(1);
ListNode* pNode2 = CreateListNode(2);
ListNode* pNode3 = CreateListNode(3);
ListNode* pNode4 = CreateListNode(4);
ListNode* pNode5 = CreateListNode(5);
ConnectListNodes(pNode1, pNode2);
ConnectListNodes(pNode2, pNode3);
ConnectListNodes(pNode3, pNode4);
ConnectListNodes(pNode4, pNode5);
Test(pNode1, pNode3);
DestroyList(pNode1);
}
// 链表中有多个结点,删除尾结点
void Test2()
{
ListNode* pNode1 = CreateListNode(1);
ListNode* pNode2 = CreateListNode(2);
ListNode* pNode3 = CreateListNode(3);
ListNode* pNode4 = CreateListNode(4);
ListNode* pNode5 = CreateListNode(5);
ConnectListNodes(pNode1, pNode2);
ConnectListNodes(pNode2, pNode3);
ConnectListNodes(pNode3, pNode4);
ConnectListNodes(pNode4, pNode5);
pNode1 = Test(pNode1, pNode5);
DestroyList(pNode1);
}
// 链表中有多个结点,删除头结点
void Test3()
{
ListNode* pNode1 = CreateListNode(1);
ListNode* pNode2 = CreateListNode(2);
ListNode* pNode3 = CreateListNode(3);
ListNode* pNode4 = CreateListNode(4);
ListNode* pNode5 = CreateListNode(5);
ConnectListNodes(pNode1, pNode2);
ConnectListNodes(pNode2, pNode3);
ConnectListNodes(pNode3, pNode4);
ConnectListNodes(pNode4, pNode5);
pNode1 = Test(pNode1, pNode1);
DestroyList(pNode1);
}
// 链表中只有一个结点,删除头结点
void Test4()
{
ListNode* pNode1 = CreateListNode(1);
pNode1 = Test(pNode1, pNode1);
}
// 链表为空
void Test5()
{
Test(nullptr, nullptr);
}
int main(int argc, char* argv[])
{
Test1();
Test2();
Test3();
Test4();
Test5();
return 0;
}