现在的位置: 首页 > 综合 > 正文

在O(1)时间内删除链表节点

2013年12月09日 ⁄ 综合 ⁄ 共 797字 ⁄ 字号 评论关闭

问题描述:

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

抱歉!评论已关闭.