问题描述:
给定链表的头指针和一个结点指针,在O(1)时间删除该结点
这本是一道难度不大的题目,但因为需要考虑的问题比较复杂,导致百分百实现这道算法题并不容易。
需要考虑的几种情况:
第一,被删节点在链表中间
第二,被删节点是尾节点
第三,被删结点是头结点,且只有一个节点
第四,被删节点是头结点,且有多个节点
因为删除节点涉及到链表表头节点的修改,所以表头节点应该用指针的指针来表示
struct listNode
{
int data;
struct listNode *next;
};
void delNode(struct listNode **pHead, struct listNode *delNode)
{
if(pHead==NULL || delNode==NULL ||*pHead ==NULL)
{
throw new Exception("the input is error");
}
if(*pHead==delNode)
{
if(delNode->next==NULL)
{
delete delNode;
*pHead=NULL;
delNode=NULL;
}else
{
delete delNode;
delNode=NULL;
*pHead=(*pHead)->next;
}
}else
{
if(delNode->next!=NULL)
{
struct listNode *tmpNode=delNode->next;
delNode->data=tmpNode->data;
delNode->next=tmpNode->next;
delete tmpNode;
tmpNode=NULL;
}else
{
struct listNode *tmpNode=*pHead;
while(tmpNode->next!=delNode)
{
tmpNode=tmpNode->next;
}
tmpNode->next=NULL;
delete delNode;
delNode=NULL;
}
}
}