算法——链表问题集锦
2015-06-24 22:58
363 查看
直接上代码
如何判断一个单向链表是否有环的问题:
1、如何判断是否存在环?
2、如何知道环的长度?
3、如何找出环的连接点在哪里?
4、带环链表的长度是多少?
观点参考地址:
http://blog.sina.com.cn/s/blog_725dd1010100tqwp.html
typedef struct MyNode{ int data; MyNode * pNext; MyNode(int d=0,MyNode * pNe=NULL):data(d),pNext(pNe){}; }node; void OutputNode(node *pRoot) { if(pRoot==NULL) return ; cout<<pRoot->data<<" "; OutputNode(pRoot->pNext);} node * CreateTestList()//创建测试数据链表1-2-3-4-5---10 { /*函数中用new申请空间,函数结束时,自动销毁的是局部变量root/p1/p2,而申请的空间没被释放, 出现了内存泄漏,只有整个程序都退出时,系统收回进程空间,它才被释放 掉了*/ node *root; node *p1, *p2; root=p1=new node(1); for(int i=2;i<=10;i++) { p2=new node(i); p1->pNext=p2; p1=p2; } // p1->pNext=root;//有环数据 return root; } node * Reverse(node *pRoot)//单向链表逆转 { if(pRoot==NULL) return pRoot;// node * pPre=NULL, * pCur=pRoot,* pNe=pRoot->pNext; do{pNe=pCur->pNext; pCur->pNext=pPre; pPre=pCur; pCur=pNe; }while(pCur!=NULL ); return pPre; } int Len(node * pRoot)//计算链表的长度 { if(pRoot==NULL) return 0; int len=0; node * pCur=pRoot; do{len++; pCur=pCur->pNext; }while(pCur!=NULL ); return len; } //找出单向链表中中间结点 node * GetMidNode(node * pRoot) { node * step1=pRoot, * step2=pRoot; while(NULL!=step2){ step2=step2->pNext; if(NULL==step2) return step1; step2=step2->pNext; if(NULL==step2) return step1; step1=step1->pNext; } return NULL; } //从无头单链表中删除节点 void DeleteCurNode(node * & pCur) { assert(pCur!=NULL); //最后一个节点情况无法解决 node * pNext=pCur->pNext; if(pNext!=NULL) { pCur->data=pNext->data; pCur->pNext=pNext->pNext; delete pNext; } //这里如果pNext==NULL直接delete pCur的话,单向链表就没有尾了。 } //已知两个链表head1 和head2 各自有序,请把它们合并成一个链表依然有序 node * Merge(node * head1,node * head2) { if(head1==NULL) return head2;//p2节点插入到p1节点链表中 if(head2==NULL) return head1; node * head,* p1,*p2; head=p1=p2=NULL; if(head1->data<=head2->data) {head=head1; p1=head1->pNext; p2=head2; } else{ head=head2;p1=head1; p2=head2->pNext;} node *pCur=head;//刚加入合并后链表的结点 while(p1!=NULL && p2!=NULL){ if(p1->data<=p2->data) {pCur->pNext=p1; pCur=p1; p1=p1->pNext;} else { pCur->pNext=p2; pCur=p2; p2=p2->pNext;} } if(p1!=NULL) pCur->pNext=p1; if(p2!=NULL) pCur->pNext=p2; return head; } node * Merge2(node *head1,node *head2)//递归合并两个有序链表 { if(head1==NULL) return head2; if(NULL==head2) return head1; node * head; if(head1->data<=head2->data) { head=head1; head->pNext=Merge2(head1->pNext,head2); } else { head=head2; head->pNext=Merge2(head1,head2->pNext); } return head; }
如何判断一个单向链表是否有环的问题:
1、如何判断是否存在环?
2、如何知道环的长度?
3、如何找出环的连接点在哪里?
4、带环链表的长度是多少?
观点参考地址:
http://blog.sina.com.cn/s/blog_725dd1010100tqwp.html
相关文章推荐
- 使用超链接实现企业QQ在线客服
- 手斧Linux – 从LFS到Funtoo (41)
- char* 类型使用总结
- How to decide on the correct number of clusters?
- android 滑动返回
- 元素距离页面的绝对距离
- 手斧Linux – 从LFS到Funtoo (40)
- u-boot2010.03 分析篇(二)-----lowlevel.init.S
- 深入浅出Java回调机制
- 算法——递归思想解决排列组合问题
- 手斧Linux – 从LFS到Funtoo (39)
- 免密码登录服务器python脚本
- VB中错误处理On Error的应用
- 正则表达式在iOS中的运用
- 数据结构——Stack和Queue的互相实现
- ios 在UITableViewController上添加悬浮视图
- 手斧Linux – 从LFS到Funtoo (38)
- DayDayUP_Linux运维学习_mysql安装(源码编译安装)
- JAVA基础第五天 (15-6-23)
- Nagios和cacti