递归实现有序链表(不需要使用两个指针)
来源:互联网 发布:c语言 fft 编辑:程序博客网 时间:2024/04/28 06:28
在使用有序链表作为基本数据结构时,当插入数据时,为了保持链表的有序性,我们需要两个指针来定位插入位置。通过递归我们可以巧妙的实现不要两个指针的做法。
// SortedSingleList.cpp : Defines the entry point for the console application.//#include "stdafx.h"/*在单链表中有序插入元素时,一般使用两个指针,一个扫描指针,一个指向扫描指针前一项的指针,因为单链表只能访问下一个元素,而无法访问上一个元素,所以当用扫描指针找到插入位置时,需要通过前一项指针来访问插入位置《编程珠玑》给出了一个通过递归的方法不使用两个指针的实现方法,代码如下(通过实现一个集合的接口来体现,集合的底层实现是有序链表)*/#include<iostream>using namespace std;class MySet{private:struct Node{int val;Node* next;Node(int val, Node* next = NULL) :val(val), next(next){}};Node* head;Node* sentinel;int elemCount;int maxElem;int n;Node* rinsert(Node* p, int t){if (p->val<t){p->next = rinsert(p->next, t);}else if (p->val>t){p = new Node(t, p);n++;}return p;}public:MySet(int elemCount, int maxElem) :elemCount(elemCount), maxElem(maxElem + 1), n(0){head = sentinel = new Node(this->maxElem);cout << "set para:" << "elemCount " << this->elemCount << " maxElem: " << this->maxElem << endl;}void insert(int x){if (n == elemCount){cerr << "set is full" << endl;}else{head = rinsert(head, x);}}int size(){return n;}void report(int* res){int j = 0;for (Node* p = head; p != sentinel; p = p->next){res[j++] = p->val;}}};int _tmain(int argc, _TCHAR* argv[]){int a[] = { 5, 7, 4, 8, 3, 2, 9, 6, 4, 8, 1 };int n = sizeof(a) / sizeof(a[0]);MySet mset(n, 9);int *res = new int[n];for (int i = 0; i<n; ++i){res[i] = 0;}mset.report(res);int nn = mset.size();cout << "before insert" << endl;for (int i = 0; i<nn; ++i){cout << res[i] << " ";}cout << endl;cout << "after insert" << endl;for (int i = 0; i<n; ++i){mset.insert(a[i]);}mset.report(res);nn = mset.size();for (int i = 0; i<nn; ++i){cout << res[i] << " ";}cout << endl;delete[] res;return 0;}
0 0
- 递归实现有序链表(不需要使用两个指针)
- 递归实现合并两个有序链表
- 合并两个有序链表,递归实现
- 非递归实现两个有序链表
- 合并两个有序链表(Java递归实现)
- 合并两个有序链表(递归非递归方法)
- 合并两个有序链表(非递归与递归)
- 递归实现合并两个有序链表成一个链表依然有序
- 两个有序链表合并递归实现及非递归实现
- 两个有序链表的合并(递归)
- 面试题17:合并两个有序链表,递归和非递归实现
- 对两个有序的链表进行合并成一个一个有序链表(递归方法)
- 合并两个有序链表的递归与非递归
- 剑指offer--递归非递归合并两个有序链表
- 把两个有序链表合并为一个有序链表(注意空指针异常!)
- 用递归方法实现两个链表head1和head2各自有序,请把它们合并成一个链表仍然有序。(c/c++)
- 合并两个有序链表递归和迭代两种写法以及扩展问题:合并k个有序链表 java实现(leetcode21和23题)
- 有序链表的合并(递归实现)
- Android中图片过大造成内存溢出,OOM(OutOfMemory)异常解决方法
- jQuery学习之prop和attr的区别
- 在C#中主线程和子线程如何实现互相传递数据
- 社説 20150330 インドネシア 海洋安保で戦略的協力強めよ
- Windows桌面共享中一些常见的抓屏技术
- 递归实现有序链表(不需要使用两个指针)
- 应届生关于工作的困扰。
- baoj1875 HH去散步 【矩阵转移】
- 【C/C++】概念:指针和引用的区别
- 颜色
- 程序中呼叫Class(类)
- LayoutInflater、View的绘制流程、自定义View、Invalidate和postInvalidate的区别
- [省选前题目整理][BZOJ 1059][ZJOI 2007]矩阵游戏(二分图最大匹配)
- HDFS的重要参数配置<一> JVM的配置