您的位置:首页 > 其它

算法题目---在O(1)时间删除链表结点

2017-07-06 09:18 375 查看
给定单向的头指针和一个结点指针,定义一个函数在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 ConnectListNodes(ListNode* pCurrent,ListNode* pNext)

{

    if(pCurrent == NULL)

    {

        printf("errror to connect two nodes.\n");

    }

    pCurrent->m_pNext = pNext;

}

void PrintListNode(ListNode* pNode)

{

    if(pNode == NULL)

    {

        printf("The node is NULL\n");

    }

    else

    {

        printf("The key in node is %d.\n", pNode->m_nValue);

    }

}

void PrintList(ListNode* pHead)

{

    printf("PrintList starts.\n");

    

    ListNode* pNode = pHead;

    while(pNode != NULL)

    {

        printf("%d\t", pNode->m_nValue);

        pNode = pNode->m_pNext;

    }

    printf("\nPrintList ends.\n");

}

void DestroyList(ListNode* pHead)

{

    ListNode* pNode = pHead;

    while(pNode != NULL)

    {

        pHead = pHead->m_pNext;

        delete pNode;

        pNode = pHead;

    }

}

void DeleteNode(ListNode** pListHead ,ListNode* pToBeDeleted)

{

    if(!pListHead || !pToBeDeleted)

        return;

    

    if(pToBeDeleted->m_pNext != NULL)

    {

        ListNode* pNext = pToBeDeleted->m_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;

    }

}

void Test(ListNode* pListHead, ListNode* pNode)

{

    printf("The original list is: \n");

    PrintList(pListHead);

    printf("The node to be deleted is: \n");

    PrintListNode(pNode);

    DeleteNode(&pListHead, pNode);

    

    printf("The result list is: \n");

    PrintList(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);

    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);

    Test(pNode1, pNode1);

    DestroyList(pNode1);

}

void Test4()

{

    ListNode* pNode1 = CreateListNode(1);

    Test(pNode1, pNode1);

}

void Test5()

{

    Test(NULL, NULL);

}

int main()

{

    Test1();

    Test2();

    Test3();

    Test4();

    Test5();

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: