剑指offer面试题13扩展:带头指针的单链表的操作
2014-07-06 16:29
369 查看
代码:
//带有头指针的链表操作 //2014.7.6 #include<iostream> #include<cstdlib> using namespace std; typedef struct node { int data; struct node *next; }Node; void insert_node(Node **pphead,int v) { if(*pphead==NULL) { *pphead=(Node *)malloc(sizeof(Node)); (*pphead)->data=v; (*pphead)->next=NULL; } else { Node *t=*pphead; *pphead=(Node *)malloc(sizeof(Node)); (*pphead)->data=v; (*pphead)->next=t; } } //--------------------------------------------------------------------------------------------------------平均时间复杂度为O(1)的节点删除算法 void delete_node1(Node **pphead,int v)//参考剑指offer ,面试题13,酷壳linus { Node *pNode=*pphead; while(pNode!=NULL) { if(pNode->data==v) break; else pNode=pNode->next; } if(pNode==NULL)//遍历整个链表,没有找到对应节点 { cout<<"No node with v value exist"<<endl; } //要找的节点是尾节点(或者当链表中只有一个节点,且该节点就是要找的那个节点时)时, //由于无法再用“将要删除节点A的后继节点B的内容赋值给A,并将A的next指针指向B的后继节点,然后free(B)”, //只能用顺序查找的方法找到A的前驱节点C,让C指向A的后继节点 else if(pNode->next==NULL) { Node *pre=*pphead; while(pre->next!=pNode) { pre=pre->next; } pre->next=NULL; free(pNode); pNode=NULL; } //当链表中的节点不是尾结点时,“将要删除节点A的后继节点B的内容赋值给A,并将A的next指针指向B的后继节点,然后free(B)” else { Node *pNext=pNode->next; pNode->next=pNext->next; pNode->data=pNext->data; free(pNext); pNext=NULL; } } //--------------------------------------------------------------------------------------------------------------------------------------- //------------------------------------------------------------------------------------------------------------------------时间复杂度为O(n),比较经典的的一种方法 void delete_node2(Node **pphead,int v) { Node *cur=*pphead; Node *pre=NULL; if(cur==NULL) { cout<<"Now ,the link is empty!"<<endl; return; } for( ;cur;pre=cur,cur=cur->next) { if(cur->data==v) break; } if(pre==NULL)//要删除的是第一个节点 { //Node *pnode=*pphead; *pphead=cur->next; free(cur); } else { pre->next=cur->next; free(cur); } } //--------------------------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------利用二级指针进行链表节点的删除,时间复杂度为O(1) //---*********************************该方法是效率最高的一种删除链表节点的方法,利用二级指针进行链表的************************************** void delete_node3(Node **pphead,int v) { Node **cur=pphead; for(cur=pphead;*cur;) { Node *en=*cur; if(en->data==v) { *cur=en->next; free(en); break; } else { cur=&en->next; } } } void print_node(Node **pphead) { for(Node *cur=*pphead;cur;cur=cur->next) cout<<cur->data<<" "; cout<<endl; } int main(void) { Node *firNode=NULL; for(int i=1;i<=10;i++) insert_node(&firNode,i); print_node(&firNode); delete_node1(&firNode,10); delete_node2(&firNode,1); delete_node3(&firNode,3); delete_node3(&firNode,9); print_node(&firNode); }
相关文章推荐
- 剑指offer面试题13扩展------Linus:利用二级指针删除单向链表
- 剑指offer面试题15——扩展2:判断一个单向链表是否形成环结构
- 剑指Offer之面试题13:在O(1)时间删除链表结点
- 剑指Offer:面试题13——在O(1)时间删除链表结点
- func2-3-1.c 不带头结点的单链表的扩展操作
- 剑指Offer面试题13(java版):在O(1)时间删除链表节点
- 《剑指offer》(面试题13):在O(1)时间删除链表结点
- 剑指offer编程题Java实现——面试题13在O(1)时间内删除链表节点
- 剑指offer 面试题13—在O(1)时间删除链表节点
- 剑指offer——面试题13:在O(1)时间删除链表结点
- 剑指offer 面试题13 在o(1)时间删除链表结点
- 剑指offer算法题之单链表的删除结点操作--面试题13:在O(1)时间删除链表结点
- 剑指offer 面试题13:在O(1)时间删除链表结点(C++版)
- 剑指Offer系列-面试题13:在O(1)时间删除链表结点
- 《剑指offer》面试题57 删除链表中重复的结点 C++ 实现 以及 错误总结 (指针问题)!!
- (剑指Offer)面试题13:在O(1)时间内删除链表结点
- 剑指offer面试题13:O(1)删除链表结点
- 《剑指offer》面试题13:在O(1)时间删除链表结点
- 不带头结点的单链表插入操作隐含的错误、、
- 内存管理(链表,指针操作,繁琐)