剑指offer 面试题13中 Test4 不应再销毁pNode1

来源:互联网 发布:淘宝小众男装店铺推荐 编辑:程序博客网 时间:2024/05/24 05:48

剑指offer  面试题13代码如下:

// DeleteNodeInList.cpp : Defines the entry point for the console application.//// 《剑指Offer——名企面试官精讲典型编程题》代码// 著作权所有者:何海涛#include "stdafx.h"#include "..\Utilities\List.h"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;}


Test4中在Test(pNode1,pNode1);中已经将头结点销毁了,所以实际上就没有pNode1这个结点了

添加DestroyList(NULL);是可以的,

但是添加DestroyList(pNode1);后虽然编译通过,运行也可以出结果,但是会弹出这样的提示窗口


因为此时根本就没有pNode1这个结点,所以就出现这样的错误


在List.cpp中 DestroyList函数定义如下,并非是其鲁棒性不好,而是输入的参数错误

void DestroyList(ListNode* pHead)
{
    ListNode* pNode = pHead;
    while(pNode != NULL)
    {
        pHead = pHead->m_pNext;
        delete pNode;
        pNode = pHead;
    }
}

0 0
原创粉丝点击