面试题13在o(1)时间删除链表结点
来源:互联网 发布:java 创建线程 sleep 编辑:程序博客网 时间:2024/06/05 11:02
面试题13:在O(1)时间删除链表结点
题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。
链表结点与函数的定义如下:
struct ListNode{ int m_nValue; ListNode* m_pNext;};void DeleteNode(ListNode** pListHead,ListNode* pToBeDeleted);
删除结点的操作我们经常碰到,比如一个链表A->B->C->D->E->F->G。如果我们要删除结点E,那么我们只需要让结点D的指针指向结点F即可,但是我们现在只给出链表头结点的指针以及结点E的指针,而又是单项链表,不能在O(1)时间内得到被删除结点前面的那一个结点的指针,所以我们原先的方法是不能在O(1)时间内删除结点E的。
那么既然我们不能获得被删除结点的前一个结点的指针,我们就需要转变思路来考虑是否能够用过被删除结点后一个结点的指针来解决方法。因此被删除结点E的后一个结点指针是很容易得到的,也就是E->m_pNext。
那么我们可能会想到如下方法:获得F的指针,将F的数据赋值给E,然后让E指向F的下一个结点。这里虽然删除的是结点F,但是相当于删除的是结点E。并且是O(1)时间复杂度。下面给出代码实例:
#include<iostream>#include<stdlib.h>using namespace std;struct ListNode{int _val;ListNode* _next;};ListNode* CreateListNode(int val){ListNode* Node=new ListNode();Node->_val=val;Node->_next=NULL;return Node;}//void AddtoTail(ListNode** Head,int val)//{//ListNode* New=new ListNode();//New->_val=val;//New->_next=NULL;//if(*Head==NULL)//{//*Head=New;//}//else//{//ListNode* Node=*Head;//while(Node->_next!=NULL)//{//Node=Node->_next;//}//Node->_next=New;//}//}void connetListNode(ListNode* front,ListNode* next){if(front==NULL){cout<<"前一个结点不能为空"<<endl;exit(1);}else{front->_next=next;}}void PrintList(ListNode* Head){ListNode* Node=Head;while(Node!=NULL){cout<<Node->_val<<" ";Node=Node->_next;}cout<<endl;}void DeleteNode(ListNode** Head,ListNode* todelete){//删除的节点后面还有结点if(todelete->_next!=NULL){ListNode* Next=todelete->_next;todelete->_val=Next->_val;todelete->_next=Next->_next;delete Next;Next=NULL;}//只有一个头结点,删除是头,也是尾else if(*Head==todelete){delete todelete;todelete=NULL;*Head=NULL;}//删除的有多个节点,而且也是最后一个,只能遍历else{ListNode* Node=*Head;while(Node->_next!=todelete){Node=Node->_next;}Node->_next=NULL;delete todelete;todelete=NULL;}}int main(){ListNode* node1=CreateListNode(1);ListNode* node2=CreateListNode(2);ListNode* node3=CreateListNode(3);ListNode* node4=CreateListNode(4);ListNode* node5=CreateListNode(5);ListNode* node6=CreateListNode(6);connetListNode(node1,node2);connetListNode(node2,node3);connetListNode(node3,node4);connetListNode(node4,node5);connetListNode(node5,node6);PrintList(node1);DeleteNode(&node1,node1);PrintList(node1);DeleteNode(&node1,node3);PrintList(node1);DeleteNode(&node1,node6);PrintList(node1);system("pause");return 0;}
阅读全文
0 0
- 面试题13:在O(1)时间删除单链表结点
- 面试题13:在O(1)时间删除链表结点
- [剑指offer][面试题13]在O(1)时间删除链表结点
- 面试题13 在o(1)时间删除链表的给定结点
- 面试题13:在O(1)时间删除链表结点
- 面试题13-在o(1)时间删除链表结点
- 《剑指Offer》面试题13:在O(1)时间删除链表结点
- 【剑指Offer学习】【面试题13 :在O(1)时间删除链表结点】
- 《剑指Offer》学习笔记--面试题13:在O(1)时间删除链表结点
- 剑指offer--面试题13:在O(1)时间删除链表结点--Java实现
- 面试题13:在O(1)的时间删除链表结点
- 面试题13:在O(1)时间删除链表结点
- 剑指offer-面试题13:在O(1)时间删除链表结点
- 剑指offer之面试题13在O(1)时间删除链表结点
- 剑指Offer----面试题13:在O(1)时间删除链表结点
- 剑指Offer:面试题13——在O(1)时间删除链表结点
- 剑指offer面试题13:在O(1)时间删除链表结点
- 剑指offer——面试题13:在O(1)时间删除链表结点
- 关于Sringmvc开发 api 与 app 数据传输特殊字符(如%)转义问题
- JavaScrip数组去重(进阶版- 包含NaN,undefined,null)
- 《深入理解Java虚拟机》读书笔记:第二章Java内存区域与内存溢出异常
- 在Eclipse中配置刚安装好的PyDev插件
- POJ 1300 Door Man 笔记
- 面试题13在o(1)时间删除链表结点
- 有道云笔记Markdown简明版使用指南
- Unity3D开发之折线图制作
- python通过get方式,post方式发送http请求和接收http响应-urllib urllib2
- 还在千篇一律地群发邮件?五大交互式邮件让邮件营销“活”起来!
- Word中批量进行中英文标点的转换
- 数字证书包含哪些内容
- ubuntu14 安装cmake3.+
- php操作redis中的hash和zset类型数据的方法和代码例子