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

题目:给定链表的头指针和一个结点指针,在O(1)时间内删除该结点,链表结点的定义如下:

struct ListNode
{
    int m_nKey;
    ListNode* m_pNext;
};

函数的声明如下:

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

答:

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <ctime>
using namespace std;

struct ListNode
{
    int m_nKey;
    ListNode* m_pNext;
};

//构造链表
void CreateList(ListNode *&pHead, fstream &fin,  ListNode *&pToBeDeleted)
{
    ListNode *pNode = NULL;
    ListNode *pTmp = NULL;
    int data;
    fin>>data;
    srand((unsigned)time(NULL));
    while (data)
    {
        pNode = new ListNode;
        pNode->m_nKey = data;
        pNode->m_pNext = NULL;
        if (NULL == pHead)
        {
            pHead = pNode;
            pTmp = pNode;
        }
        else
        {
            pTmp->m_pNext = pNode;
            pTmp = pNode;
        }
        if (NULL == pToBeDeleted && !(rand() % 5))
        {
            pToBeDeleted = pNode;
        }

        fin>>data;
    }
}

//在O(1)时间内删除链表结点
void DeleteNode(ListNode *pListHead, ListNode *pToBeDeleted)
{
    if (NULL != pToBeDeleted->m_pNext)
    {
        ListNode *pRealDeleted = pToBeDeleted->m_pNext;
        pToBeDeleted->m_nKey = pRealDeleted->m_nKey;
        pToBeDeleted->m_pNext = pRealDeleted->m_pNext;
        delete pRealDeleted;
    }
    else
    {
        ListNode *pNode = pListHead;
        while (NULL != pNode)
        {
            if (pNode->m_pNext == pToBeDeleted)
            {
                pNode->m_pNext = NULL;
                delete pToBeDeleted;
                break;
            }
            pNode = pNode->m_pNext;
        }
    }
}

//输出链表
void PrintList(ListNode *pHead)
{
    if (NULL == pHead)
    {
        return;
    }
    ListNode *pNode = pHead;
    while (NULL != pNode)
    {
        cout<<pNode->m_nKey<<"  ";
        pNode = pNode->m_pNext;
    }
    cout<<endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
    fstream fin("list.txt");
    ListNode *pHead = NULL;
    ListNode *pToBeDeleted = NULL;
    CreateList(pHead, fin, pToBeDeleted);
    cout<<"原来的链表:";
    PrintList(pHead);
    DeleteNode(pHead, pToBeDeleted);
    cout<<"删除后链表:";
    PrintList(pHead);

    cout<<endl;
    return 0;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值