删除链表结点

来源:互联网 发布:matlab 生成网络拓扑 编辑:程序博客网 时间:2024/05/16 23:53

面试题13:
题目:给定单项链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。

//链表结点struct ListNode{    int m_nvalue;    ListNode* m_pNext;};//创建链表ListNode* CreateListNode(int value){    ListNode *pNode = new ListNode();    pNode->m_nvalue = value;    pNode->m_pNext = NULL;    return pNode;}//连接链表的两个结点void  ConnectListNode(ListNode* pCurrent,ListNode* pNext){    if(pCurrent == NULL)    {        cout<<"前一个节点为空:"<<endl;        exit(1);    }    else    {        pCurrent->m_pNext = pNext;    }}//打印链表信息void PrintList(ListNode* pHead){    ListNode *pNode = pHead;    while(pNode != NULL)    {        cout<<pNode->m_nvalue <<"->";        pNode = pNode->m_pNext ;    }    cout<<"nul"<<endl;}//删除链表结点void DeleteNode(ListNode** pListHead,ListNode* pToBeDeleted){    if(!pListHead ||!pToBeDeleted)        return ;    //要删除的结点后面还有结点    if(pToBeDeleted->m_pNext != NULL)    {        ListNode *pNext = pToBeDeleted->m_pNext ;        //将pNext的内容复制到 pToBeDeleted,再将 pToBeDeleted的指针指向pNext的下一个结点        pToBeDeleted->m_nvalue = pNext->m_nvalue ;        pToBeDeleted->m_pNext = pNext->m_pNext ;        delete pNext;        pNext = NULL;    }    //链表只有一个结点,删除头结点    else if(*pListHead == pToBeDeleted)    {        delete pToBeDeleted;        pToBeDeleted = NULL;        *pListHead = NULL;    }    //链表中有多个结点,删除最后一个尾结点    else    {        ListNode *pNode = *pListHead;        while(pNode->m_pNext !=pToBeDeleted)        {            pNode = pNode->m_pNext ;        }        pNode->m_pNext = NULL;        delete pToBeDeleted;        pToBeDeleted = NULL;    }}int main(){    ListNode* pNode1 = CreateListNode(1);    ListNode* pNode2 = CreateListNode(2);    ListNode* pNode3 = CreateListNode(3);    ListNode* pNode4 = CreateListNode(4);    ListNode* pNode5 = CreateListNode(5);    ListNode* pNode6 = CreateListNode(6);    ListNode* pNode7 = CreateListNode(7);    ConnectListNode(pNode1,pNode2);    ConnectListNode(pNode2,pNode3);    ConnectListNode(pNode3,pNode4);    ConnectListNode(pNode4,pNode5);    ConnectListNode(pNode5,pNode6);    ConnectListNode(pNode6,pNode7);    PrintList(pNode1);    DeleteNode(&pNode1,pNode3);    PrintList(pNode1);}

“`

原创粉丝点击