问题描述:
给定链表的头指针和一个结点指针,在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; } } }