zoukankan      html  css  js  c++  java
  • 数据结构-在O(1)时间删除链表节点

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

    分析:本题目是基于一个假设,要删除的节点的确在链表中。因为我们需要O(n)的时间来判断该节点是否在链表中。

    /*
    剑指offer面试题13
    本题注意考虑时间效率;
    考虑删除节点会是否是尾节点,头节点。以及是否为空判断
    为了保证O(1)的时间效率。所以采用直接用要删除的节点覆盖next。
    再删除next节点,而不是顺序遍历
    为了代码的完整性,初始化了3个节点。
    */
    #include <iostream>
    
    using namespace std;
    
    struct ListNode{
        ListNode* next;
        int data;
    };
    
    //用指针的指针为了防止head是NULL。
    void DeleteNode(ListNode** head,ListNode* Todel){
        if(!head || !Todel){
            return;
        }
    
        if(Todel->next != NULL){
            ListNode* p = Todel->next;
            Todel->data = p->data;
            Todel->next = p->next;
            delete p;
            p = NULL;
        }
        else if(*head == Todel){
            delete Todel;
            Todel = NULL;
            *head = NULL;
        }
        //假如是尾节点,需要顺序遍历
        else{
            ListNode* p;
            while(p->next != Todel){
                p = p->next;
            }
            p->next = NULL;
            delete Todel;
            Todel = NULL;
        }
    }
    
    int main()
    {
        ListNode* head;
        ListNode* Todel;
        ListNode* tail;
    
        head = new ListNode;
        Todel = new ListNode;
        tail = new ListNode;
    
        head->data = 1;
        head->next = Todel;
        Todel->data = 2;
        Todel->next = tail;
        tail->data = 3;
        tail->next = NULL;
    
        DeleteNode(&head,Todel);
    
        return 0;
    }
  • 相关阅读:
    未让换行符弄错了数据
    REPLICATE
    内存 商业智能
    sql
    PageMethods介绍
    在ASP.NET AJAX中如何判断浏览器及计算其宽高
    用JavaScript实现网页图片等比例缩放
    js技巧收集(200多个)(转自:asp.net中文俱乐部)
    C#调用ORACLE存储过程返回结果集及函数
    Using PageMethods to access Session data
  • 原文地址:https://www.cnblogs.com/wn19910213/p/3720684.html
Copyright © 2011-2022 走看看