【数据结构】单链表—在O(1)时间删除链表结点
来源:互联网 发布:淘宝互联平台是真的吗 编辑:程序博客网 时间:2024/05/13 03:57
题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。
思路:如果按常规思路来
删除一个结点需要找到该结点的前一个结点,将这个节点的_next指向被删除节点的 _next,找到这个该结点的前一个结点就需要遍历链表,此时就不是O(1)时间。
删除结点我们不需要找到前一个结点,我们可以很方便的找到后一个节点,我们可以把后一个节点的值给前一个结点,删除后一个结点。
但是,如果我们删除的是尾结点呢?我们必须遍历链表了。
还需要考虑如果链表只有一个节点的问题。删除结点之后,需要把链表头结点置为空。
时间复杂度:1. O(n) 2. [(n-1 )*O(1)+O(n)]/n
但是是否要判断链表是否有这一删除的结点呢?
判断了时间复杂度又要加O(n)。
代码如下:
template<class T>struct ListNode{ T _value; ListNode<T>* _next; ListNode(const T& value) :_value(value) ,_next(NULL) {}};template<class T>class List{public: List() :_head(NULL) {} bool PushBack(); bool DelListNode(ListNode<T>* node)//在O(1)时间删除链表节点 head mid tail { if(_head == NULL) return false; if(node == NULL) { cout<<"该节点不存在"<<endl; return false; } if(_head == node)//head { if(_head->_next == NULL) { delete _head; return true; } else { ListNode<T>* del = _head; _head = _head->_next; delete del; return true; } } else if(node->_next == NULL)//tail { ListNode<T>* node = _head; ListNode<T>* prev = NULL; while(node->_next != NULL) { prev = node; node = node->_next; } delete node; prev->_next = NULL; return true; } else//mid { ListNode<T>* del = node->_next; node->_value = del->_value; if(del->_next == NULL) { delete del; node->_next = NULL; } else { node->_next = del->_next; delete del; } return true; } }private: ListNode<T>* _head;};
0 0
- 在O(1)时间删除链表结点[数据结构]
- 【数据结构】单链表—在O(1)时间删除链表结点
- 程序员面试题精选100题(33)-在O(1)时间删除链表结点[数据结构]
- 程序员面试题精选100题(33)-在O(1)时间删除链表结点[数据结构]
- 程序员面试题精选100题(33)-在O(1)时间删除链表结点[数据结构]
- 剑指offer(33)-在O(1)时间删除链表结点[数据结构]
- 程序员面试题精选100题(33)-在O(1)时间删除链表结点[数据结构]
- 在O(1)时间删除单链表结点
- 在O(1)时间删除链表结点--总结
- 在O(1)时间删除链表结点
- 在O(1)时间删除链表结点
- 033-在O(1)时间删除链表结点
- 在O(1)平均时间删除链表结点 [# 13]
- 在O(1)时间删除链表结点
- 在O(1)平均时间删除链表结点
- 在O(1)时间删除链表结点--总结
- 在O(1)时间删除链表结点
- 在O(1)时间删除链表结点
- android studio中New Module的几个类型的区别
- 走遍世界 —— 俄罗斯
- rabbitmq 实现原理
- TCP连接的建立与中止
- http://www.caogen.com/blog/Infor_detail/83263.html
- 【数据结构】单链表—在O(1)时间删除链表结点
- Linux下查看文件和文件夹大小
- [编写高质量iOS代码的52个有效方法](五)接口与API设计(下)
- C:forEach var Status属性
- 【区间dp】hdu5396 Expression
- Android中定时执行任务的3种实现方法
- SVN图标总结及冲突解决
- 循环语句
- Javaweb学习总结(一)--数据库连接池