zoukankan      html  css  js  c++  java
  • 【编程题目】在 O(1)时间内删除链表结点

    60.在 O(1)时间内删除链表结点(链表、算法)。
    题目:给定链表的头指针和一个结点指针,在 O(1)时间删除该结点。链表结点的定义如下:
    struct ListNode
    {
    int m_nKey;
    ListNode* m_pNext;
    };
    函数的声明如下:
    void DeleteNode(ListNode* pListHead, ListNode* pToBeDeleted);

    思路:把当前结点的下一个结点的内容复制到当前结点,删除下一结点即可。 注意,链表中只有一个结点时在题目给定的函数声明下无法删除,删除最后一个结点时需要从头寻找。

    /*
    60.在 O(1)时间内删除链表结点(链表、算法)。
    题目:给定链表的头指针和一个结点指针,在 O(1)时间删除该结点。链表结点的定义如下:
    struct ListNode
    {
    int  m_nKey;
    ListNode* m_pNext;
    };
    函数的声明如下:
    void DeleteNode(ListNode* pListHead,  ListNode* pToBeDeleted);
    */
    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct ListNode
    {
        int  m_nKey;
        ListNode* m_pNext;
    }ListNode;
    
    void DeleteNode(ListNode* pListHead,  ListNode* pToBeDeleted)
    {
        if (pToBeDeleted == NULL || pListHead == NULL)
        {
            return;
        }
        if (pToBeDeleted->m_pNext == NULL) //删除最后一个节点
        {
            ListNode* x = pListHead;
            if (pToBeDeleted == pListHead) //只有一个节点
            {
                printf("can't delete the only note
    ");
            }
            else
            {
                while (x->m_pNext != pToBeDeleted) //删除最后一个节点必须循环删 直接赋值NULL是不行的 因为输入的是指针的一个副本
                {
                    x = x->m_pNext;
                }
                x->m_pNext = NULL;
                free(pToBeDeleted);
            }
            return;
        }
        //把下一个结点的数据复制到当前结点,实际删除下一结点
        ListNode * tmp = pToBeDeleted->m_pNext;
        pToBeDeleted->m_nKey = pToBeDeleted->m_pNext->m_nKey;
        pToBeDeleted->m_pNext = pToBeDeleted->m_pNext->m_pNext;
        free(tmp); 
    }
    
    void printList(ListNode* pListHead)
    {
        ListNode* x = pListHead;
        while (x != NULL)
        {
            printf("%d ->" , x->m_nKey);
            x = x->m_pNext;
        }
        printf("
    ");
    }
    
    void createList(ListNode* &pListHead)
    {
        int data;
        scanf("%d", &data);
        if (data != 0)
        {
            pListHead = (ListNode*)malloc(sizeof(ListNode));
            pListHead->m_nKey = data;
            pListHead->m_pNext = NULL;
            createList(pListHead->m_pNext);
        }
    }
    
    int main()
    {
        ListNode * p = NULL;
        createList(p);
        printList(p);
        DeleteNode(p, p->m_pNext);
        printList(p);
    
        return 0;
    }
  • 相关阅读:
    JAVA多态
    JAVA中的继承
    Nginx配置中root和alisa指定文件路径的区别
    NGINX配置详解
    Jenkins填坑之邮件模板分享
    jenkins填坑之HTML报告样式问题
    Jenkins填坑之仅获取本次构建的HTML报告作为附件发送邮件
    Jenkins填坑之发送邮件无法获取HTML报告作为附件
    jenkins填坑之邮件模板中的变量无法正常获取值
    Jenkins填坑之构建ant项目时,执行结果提示input file xxx.jtl does not exist
  • 原文地址:https://www.cnblogs.com/dplearning/p/3912347.html
Copyright © 2011-2022 走看看