面试题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
原创粉丝点击