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

来源:互联网 发布:红外万能遥控器软件 编辑:程序博客网 时间:2024/06/18 11:31

问题:给定一个单项链表的头指针和一个结点指针,定义一个函数在O(1)的时间删除该节点。算法实现如下:

#include "stdafx.h"#include "..\Utilities\List.h"//在平均O(1)时间删除结点的算法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 _tmain(int argc, _TCHAR* argv[]){    Test1();    Test2();    Test3();    Test4();    Test5();    return 0;}运行结果如下:



0 0
原创粉丝点击