码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-11-27 06:57:57      阅读:129      评论:0      收藏:0      [点我收藏+]

标签:删除链表结点;c++;o(1)

题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间内删除节点。链表结点与函数的定义如下:

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

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

分析:要删除结点i,先把i的下一个节点j的内容复制给i,然后把i的指针指向结点j的下一个结点。此时再删除结点j,其效果相当于把结点i删除了。

上述思路有几个小问题:1.如果要删除的结点位于链表的尾部,那么就没有下一个节点,我们只能从头遍历链表并完成删除。2.如果链表中只有一个节点,而我们又要删除链表的头结点,此时我们在删除结点之后还要把链表的投结点置NULL。下面是实现代码:

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:
    }
}


本文出自 “仙路千叠惊尘梦” 博客,请务必保留此出处http://secondscript.blog.51cto.com/9370042/1582956

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

标签:删除链表结点;c++;o(1)

原文地址:http://secondscript.blog.51cto.com/9370042/1582956

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!