表,栈和队列
来源:互联网 发布:淘宝盗图技巧 编辑:程序博客网 时间:2024/06/05 19:17
表,栈和队列
表的简单数组
对表的所有操作都可以使用数组来实现。虽然数组是静态分配的,但是内部存储数组的
数组实现使得
简单链表
为了避免插入和删除的线性开销,需要允许表的不连续存储,否则表的部分或全部就需要整体移动。链表由一系列不必存在内存中的相连的节点组成。每一个结点均含有表元素和到包含该元素后继元的结点的链
为了执行
链表的头插法和尾插法
头插法:在头结点(为了操作方便,在单链表的第一个结点之前附加一个结点,称为头结点。头结点的数据域可以存储数据标题、表长等信息,也可以不存储任何信息,其指针域存储第一个结点的首地址)。Head之后插入数据,其特点是读入的数据顺序与线性表的逻辑顺序正相反。
p->next=head->next;head->next=p;
尾插法:将每次插入的新结点放在链表的尾部
s->next=r->next;r->next=s;r=s;
链表题目
1.给定两个链表,分别表示两个非负整数。它们的数字逆序存储在链表中,且每个结点只存储一个数字,计算两个数的和,并且返回和的链表头指针。
如:输入:
typedef struct tagSNode{ int value; tagSNode* pNext; tagSNode(int v):value(v),pNext(NULL){}}SNode;SNode* Add(SNode* pHead1,SNode* pHead2){ SNode* pSum=new SNode(0); SNode* pTail=pSum; //新结点插入到pTail的后面 SNode* p1=pHead1->pNext; SNode* p2=pHead2->pNext; SNode* pCur; int carry=0; //进位 int value; while(p1 && p2) { value = p1->value + p2->value + carry; carry = value / 10; pCur = new SNode(value); value %=10; pTail->pNext = pCur; //新结点链接到pTail的后面 pTail = pCur; p1 = p1->pNext; //处理下一位 p2 = p2->pNext; } //处理较长的链 SNode* p=p1?p1:p2; while(p) { value=p->value+carry; carry=value/10; value %=10; pCur=new SNode(value); pTail->pNext=pCur; pTail=pCur; p=p->pNext; } //处理可能存在的进位 if(carry!=0) pTail->pNext=new SNode(carry); return pSum;}
2.链表的部分原地翻转:给定一个链表,翻转该链表从
typedef struct tagSNode{ int value; tagSNode* pNext; tagSNode(int v):value(v),pNext(NULL){}}SNode;void Reverse(SNode* pHead,int from,int to){ SNode* pCur=pHead->pNext; int i; for(i=0;i<from-1;i++){ //找到第m-1个结点,即开始翻转的第一个结点的前驱,记做head; pHead=pCur; pCur=pCur->pNext; } SNode* pPre=pCur; pCur=pCur->pNext; to--; SNode* pNext; for(;i<to;i++) { //以head为起始结点遍历n-m次,将第i次时,将找到的结点插入到head的next中即可 pNext = pCur->pNext; pCur->pNext = pHead->pNext; pHead->pNext = pCur; //头插法 pPre->pNext = pNext; pCur = pNext; } }
3.(1)给定排序的链表,删除重复元素,只保留重复元素第一次出现的结点:若
(2)若发现重复元素则重复元素全部删除。
typedef struct tagSNode { int value; tagSNode* pNext; tagSNode(int v):value(v),pNext(NULL){} }SNode;void DeleteDuplicateNode(SNode* pHead){ SNode* pPre=pHead->pNext; SNode* pCur; while(pPre){ pCur=pPre->pNext; if(pCur &&(pCur->value==pPre->value)) { pPre->pNext=pCur->pNext; delete pCur; }else{ pPre=pCur; } }}void DeleteDuplicatesNode2(SNode* pHead ){ SNode* pPre=pHead; SNode* pCur=pPre->pNext; SNode* pNext; while(pCur){ pNext=pCur->pNext; while(pNext&&(pCur->value==pNext->value)) { pPre->pNext=pNext; delete pCur; pCur=pNext; pNext=pCur->pNext; } pPre=pCur; pCur=pNext; }}void DeleteDuplicatesNode3(SNode* pHead ) { SNode *pPre = pHead; SNode *pCur = pPre->pNext; SNode *pNext; bool bDup; while (pCur) { pNext = pCur->pNext; bDup = false; while (pNext && (pCur->value == pNext->value)) { pPre->pNext = pNext; delete pCur; pCur = pNext; pNext = pCur->pNext; bDup = true; } if (bDup) //此刻的pCur与原数据重复,删之 { pPre->pNext = pNext; delete pCur; } else { pPre = pCur; } pCur = pNext; }}
4.给定一个链表和一个值
分别申请两个指针
void Partition(SNode* pHead, int pivotKey){ //两个链表的头指针 SNode* pLeftHead=new SNode(0); SNode* pRightHead=new SNode(0); //两个链表的当前最后一个元素 SNode* left=pLeftHead; SNode* right=pRightHead; SNode* p=pHead->pNext; while(p) //遍历原链表 { if(p->value<pivotKey) { left->pNext=p; left=p; } else { right->pNext=p; right=p; } p=p->pNext; } //将right链接到left尾部 left->pNext=pRightHead->pNext; right->pNext=NULL; //将整理好的链表赋值给当前链表头部 pHead->pNext=pLeftHead->pNext; delete pLeftHead; delete pRightHead;}
5.单链公共结点问题,令两链表的长度为
typedef struct tagSNode{ int value; tagSNode* pNext; tagSNode(int v):value(v),pNext(NULL){}}SNode;int CalcLength(SNode* p){ int nLen=0; while(p) { p=p->pNext; nLen++; } return nLen;}SNode* FindFirstSameNode(SNode* pA,SNode* pB){ //因为有头指针,所以指向第一个有效结点 pA=pA->pNext; pB=pB->pNext; //计算两个链表的长度 int nA=CalcLength(pA); int nB=CalcLength(pB); if(nA>nB) { swap(pA,pB); swap(nA,nB); } for(int i=0;i<nB-nA;i++) { if(pA==pB) return pA; pA=pA->pNext; pB=pB->pNext; } return NULL;}
- 表、栈和队列
- 表、栈和队列
- 表、栈和队列
- 表、栈和队列
- 表、栈和队列
- 表、栈和队列
- 表,栈和队列
- 表、栈和队列
- 表、栈和队列
- 表,栈和队列
- 线性表、栈、队列和优先队列
- 栈和队列--队列
- 【栈和队列】队列
- 线性表 && 栈和队列
- 线性表、栈和队列
- java---表、栈和队列
- java---表、栈和队列
- java---表、栈和队列
- 外网连接访问自己电脑的MySQL数据库
- dubbo管理控制台的安装
- MapReduce编程实现txt文件中的内容导入HBase
- String和StringBuffer和StringBuilder之间区别
- cocos2dx-容器的使用
- 表,栈和队列
- docker--端口映射与容器互联
- 树
- 重建二叉树
- 四种常见排序
- android-studio+Genymotion模拟器
- Ubuntu 16.04 安装 MySQL
- Js实现鼠标滚轮滑动监听
- 213. House Robber II