基于visual Studio2013解决面试题之0604O(1)时间复杂度删除链表节点
来源:互联网 发布:淘宝网男士双肩包 编辑:程序博客网 时间:2024/06/06 01:28
题目
解决代码及点评
/*在O(1)时间内删除链表节点链表结构体class ListNode{public:ListNode* _next;int _data;};class List{public:ListNode* _head;void rm(ListNode* node){// TODO: remove the node in O(1)}};一般情况下,链表删除,需要遍历到被删除节点的上一个节点,然后做删除,时间复杂度是O(n),如何在链表节点已知情况下,O(1)时间内做删除呢思路:将该链表节点的数据,和它的next节点数据互换,这样当前节点就成了prev节点了 要删除的是它的下一个,这样就不用去寻找了 特例:当该节点在最尾部时,还是需要去寻找那么在n个节点的链表里,有n-1个链表节点是O(1)复杂度,只有一个节点是O(N)复杂度平均还是O(1)复杂度*/#include <iostream>using namespace std;class ListNode{public:ListNode* _next;int _data;ListNode(int data, ListNode* next=NULL) :_data(data), _next(next){}};class List{public:ListNode* _head;List(ListNode* head = NULL) :_head(head){}void add(int data){_head = new ListNode(data, _head);}// O(1)时间内删除节点void rm(ListNode* node){if (node->_next) // 如果该节点的next不为空{ListNode* next = node->_next; node->_data = next->_data; // 将next节点的data拷贝到要被删除的节点上node->_next = next->_next; // 真正删除的是该节点的下一个节点delete next;}else // 如果该节点的next为空{ListNode* prev; for (prev = _head; prev->_next != node; prev = prev->_next); // 遍历定位prev指针 prev->_next = NULL; // 让prev的next为空delete node;}}void print(){for (ListNode* node = _head; node; node = node->_next){cout << node->_data << " ";}cout << endl;}};// 测试主函数int main(){List l;// 构造链表for (int i = 0; i < 10; i++){l.add(i);}// 打印l.print();// 随意删除一个节点ListNode* node = l._head->_next->_next;l.rm(node);// 在打印l.print();system("pause");}
代码下载及其运行
代码下载地址:http://download.csdn.net/detail/yincheng01/6704519
解压密码:c.itcast.cn
下载代码并解压后,用VC2013打开interview.sln,并设置对应的启动项目后,点击运行即可,具体步骤如下:
1)设置启动项目:右键点击解决方案,在弹出菜单中选择“设置启动项目”
2)在下拉框中选择相应项目,项目名和博客编号一致
3)点击“本地Windows调试器”运行
程序运行结果
0 0
- 基于visual Studio2013解决面试题之0604O(1)时间复杂度删除链表节点
- 基于visual Studio2013解决面试题之0609寻找链表公共节点
- 【面试题】在O(1)时间复杂度删除链表节点
- 基于visual Studio2013解决面试题之0302链表中找倒数k项节点
- 基于visual Studio2013解决面试题之0402合并升序链表并去重
- 基于visual Studio2013解决面试题之0804复杂链表
- 基于visual Studio2013解决面试题之0610删除重复字符串
- 基于visual Studio2013解决面试题之0201二叉树转链表
- 基于visual Studio2013解决面试题之0203栈实现
- 基于visual Studio2013解决面试题之0205查找路径
- 基于visual Studio2013解决面试题之0207单词翻转
- 基于visual Studio2013解决面试题之0202上下排
- 基于visual Studio2013解决面试题之0301累加
- 基于visual Studio2013解决面试题之0303数组求和
- 基于visual Studio2013解决面试题之0308Fibonacci数列
- 基于visual Studio2013解决面试题之0403串联字符串
- 基于visual Studio2013解决面试题之0407数组差
- 基于visual Studio2013解决面试题之0501上台阶
- 基于Java平台的AMF-RPC实现(BlazeDS)
- node多进程跑phantomJs
- 基于visual Studio2013解决面试题之0603调整数组
- Axis2 WebService(配置、发布、调用)
- Ubuntu13.04下搭建Java环境
- 基于visual Studio2013解决面试题之0604O(1)时间复杂度删除链表节点
- 查找文本文件中的关键字
- java.mail的搜索过滤类
- MFC界面编程技术汇总
- Xcode
- 黑马程序员-system
- 10--java-静态导入、枚举、反射
- jsp的4种会话跟踪技术
- 基于visual Studio2013解决面试题之0608找出两个只出现一次的数