首页 > 代码库 > 在O(1)的时间删除链表结点

在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=http://www.mamicode.com/pNext->m_nValue;>


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

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