zoukankan      html  css  js  c++  java
  • 《剑指offer》第十八题(在O(1)时间删除链表结点)

    // 面试题18(一):在O(1)时间删除链表结点
    // 题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该
    // 结点。
    
    #include <iostream>
    #include "List.h"
    
    void DeleteNode(ListNode** pListHead, ListNode* pToBeDeleted)
    {
        if (!pListHead || !pToBeDeleted)
            return;
    
        // 第一种情况:要删除的结点不是尾结点
        if (pToBeDeleted->m_pNext != nullptr)
        {
            ListNode* pNext = pToBeDeleted->m_pNext;//得到待删除节点的下一个节点
            pToBeDeleted->m_nValue = pNext->m_nValue;//将该节点的值和地址给覆盖待删除节点
            pToBeDeleted->m_pNext = pNext->m_pNext;
    
            delete pNext;//删除这个替罪羊
            pNext = nullptr;
        }
        // 第二种情况:链表只有一个结点,删除头结点(也是尾结点)
        else if (*pListHead == pToBeDeleted)
        {
            delete pToBeDeleted;
            pToBeDeleted = nullptr;
            *pListHead = nullptr;//注意吧头结点置空
        }
        // 第三种情况:链表中有多个结点,删除尾结点
        else
        {
            ListNode* pNode = *pListHead;
            while (pNode->m_pNext != pToBeDeleted)//只能通过顺序查找并删除了
            {
                pNode = pNode->m_pNext;
            }
    
            pNode->m_pNext = nullptr;
            delete pToBeDeleted;
            pToBeDeleted = nullptr;
        }
    }
    
    // ====================测试代码====================
    void Test(ListNode* pListHead, ListNode* pNode)
    {
        printf("The original list is: 
    ");
        PrintList(pListHead);
    
        printf("The node to be deleted is: 
    ");
        PrintListNode(pNode);
    
        DeleteNode(&pListHead, pNode);//注意这个函数的输入
    
        printf("The result list is: 
    ");
        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(nullptr, nullptr);
    }
    
    int main(int argc, char* argv[])
    {
        Test1();
        Test2();
        Test3();
        Test4();
        Test5();
        system("pause");
        return 0;
    }

     

  • 相关阅读:
    在线|九月月考选填题
    函数$f(x)=e^xpm e^{-x}$相关
    偶函数性质的推广
    2020年全国卷Ⅱ卷文科数学选填题解析版
    2020年全国卷Ⅱ卷文科数学解答题解析版
    待定系数法
    特殊方法求函数解析式
    phd文献阅读日志-4.1
    phd文献阅读日志-1.2~3.2(1.2,2.1,2.2,3.1,3.2)
    完美解决linux下vim在终端不能用鼠标复制的问题
  • 原文地址:https://www.cnblogs.com/CJT-blog/p/10485613.html
Copyright © 2011-2022 走看看