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

13:在O(1)时间删除单链表节点

时间:2015-07-06 16:03:01      阅读:99      评论:0      收藏:0      [点我收藏+]

标签:linkedlist   删除   单链表   

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


解析:
删除单向链表中的一个节点,常规做法是必须找到待删除节点的前一个节点才能实现,而这样做的时间复杂度是O(n),无法满足要求。
创新想法:当我们想删除一个节点时,并不一定要删除节点本身,可以用当前节点保存它下一节点的值,然后删除它的下一个节点。

情况案例:
1. 输入节点为NULL
2. 单链表只有一个节点,即删除头节点
3. 待删除节点是尾节点,即没有下一节点
4. 待删除不是尾节点

当待删除节点是尾节点时,采用常规方法:须找到待删除节点的前一个节点才能实现O(n),但对于其他的非尾节点可以以O(1)的时间删除,因此平均时间复杂度是[(n-1)*O(1) + O(n)]/n,结果还是O(1)

本题批注:
删除一个节点时,并不一定要删除节点本身,可删除它的下一个
删除一个节点,要free或delete,并且置为NULL

typedef struct ListNode {
    int val;
    struct ListNode* next;
} ListNode;
// 如果要找到待删除节点的前一结点就是O(n),
// 要想实现O(1)就不能查找,因此我们用待删除节点保存它下一节点的内容,然后删除下一节点
ListNode* DeleteElement(ListNode* head, ListNode* pToDeleted) {
    if (head == NULL || pToDeleted == NULL)
        return head;
    // 只有一个节点
    if (head == pToDeleted) {
        delete pToDeleted;
        head = NULL;
        pToDeleted = NULL;
        return NULL;
    }
    if (pToDeleted->next == NULL) {
        // 待删除的为最后一个节点
        ListNode* pNode = head;
        while (pNode->next != pToDeleted) // 常规方法找到待删除前一结点
            pNode = pNode->next;
        pNode->next = NULL;
        delete pToDeleted;
        pToDeleted = NULL;
    } else {
        // 要删除的节点不是尾节点
        ListNode* pNext = pToDeleted->next;
        pToDeleted->val = pNext->val;
        pToDeleted->next = pNext->next;
        delete pNext;
        pNext = NULL;
    }
    return head;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

13:在O(1)时间删除单链表节点

标签:linkedlist   删除   单链表   

原文地址:http://blog.csdn.net/quzhongxin/article/details/46775179

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