删除链表中的重复节点、剩余节点逆序输出
来源:互联网 发布:兰博基尼苹果壁纸软件 编辑:程序博客网 时间:2024/05/17 05:09
#include <stdlib.h>#include <algorithm>#include <functional>#include <iostream>#include "oj.h"using namespace std;/*功能: 输入一个不带头节点的单向链表(链表的节点数小于100),删除链表中内容重复的节点(重复的节点全部删除),剩余的节点逆序倒排。 输入: pstrIn: 输入一个不带头节点的单向链表 输出: pstrOut:删除内容重复的节点后,逆序排列的链表(不带头节点,链表第一个节点的内存已经申请)。 返回:示例:输入链表的内容依次为 6,7,8,8,9,10,6则输出链表的内容依次应该是 10,9,7 */int iChanProcess(strNode * pstrIn,strNode * pstrOut){if (NULL == pstrIn || NULL == pstrOut){return -1;}strNode *pCur = pstrIn;int len = 0;while (NULL != pCur){len++;pCur = pCur->pstrNext;}int *iArray = new int [len];pCur = pstrIn;int iCur =0;while (NULL != pCur){iArray[iCur] = pCur->data;iCur++;pCur = pCur->pstrNext;}sort(iArray,iArray + len, greater<int>());pCur = pstrOut;iCur = 0;int flag = 0; //标记输出的第一个节点是否被使用int *iArrayTemp = new int [len];memset(iArrayTemp, 0 , sizeof(int) * len);int iCurTemp =0;int tempLen = 0;if (iArray[iCur] == iArray[iCur + 1])//处理第一节点{iCur ++;}else{iArrayTemp[iCurTemp] = iArray[iCur];iCurTemp++;iCur++;}for (; iCur < len -1; ++iCur){if (iArray[iCur] == iArray[iCur - 1] ||iArray[iCur] == iArray[iCur + 1]){continue;}else{iArrayTemp[iCurTemp] = iArray[iCur];iCurTemp++;}}if (iArray[iCur] != iArray[iCur - 1] )//处理最后一个节点{iArrayTemp[iCurTemp] = iArray[iCur];iCurTemp++;}int iTempLen = iCurTemp;pCur = pstrOut;pCur->data = iArrayTemp[0];pCur->pstrNext = NULL ;for (int i = 1; i < iCurTemp ; ++ i ){strNode *node = new strNode;node->data = iArrayTemp[i];node->pstrNext =NULL;pCur->pstrNext = node;pCur = pCur->pstrNext;}return 0;}/* 释放链表 */void vFreeChan(strNode * pstrChan){ if (NULL == pstrChan) {return ; }strNode * pCur = pstrChan;strNode * pNext = pstrChan;while (NULL != pCur){pNext = pCur->pstrNext;delete pCur;pCur = NULL;pCur = pNext;} return;}strNode *vCreatChan(int * piData, int iNum){int iLoop = 0;strNode * pstrChanHead = NULL;strNode * pstrChanEnd = NULL;strNode * pstTemp = NULL;if ((NULL == piData) || (iNum < 1)){return NULL;}pstrChanHead = (strNode *)malloc(sizeof(strNode));pstrChanHead->data = *piData;pstrChanHead->pstrNext = NULL;pstrChanEnd = pstrChanHead;for (iLoop = 1; iLoop < iNum; iLoop++){pstTemp = (strNode *)malloc(sizeof(strNode));pstTemp->data = piData[iLoop];pstTemp->pstrNext = NULL;pstrChanEnd->pstrNext = pstTemp;pstrChanEnd = pstrChanEnd->pstrNext;}return pstrChanHead;}int iChanToArray(strNode *pstrChan, int * piData, int * piLenth){int iLoop = 0;strNode *pstrTemp = pstrChan;if ((NULL == pstrChan) || (NULL == piData) || (NULL == piLenth)){return -1;}while(NULL != pstrTemp){*(piData + iLoop) = pstrTemp->data;pstrTemp = pstrTemp->pstrNext;iLoop++;}*piLenth = iLoop;return 0;}int main(){strNode * pstrIn = NULL;strNode * pstrOut = NULL;int iLenth = 0;int iaDataIn[7] = {6, 7, 8, 8 ,9, 10, 6};int iaDataOut[7] = {10,9,7};int iaDataMyOut[7] = {0};pstrIn = vCreatChan(iaDataIn, 7);pstrOut = (strNode *)malloc(sizeof(strNode));pstrOut->pstrNext = NULL;/* TODO: 调用被测函数 *///请考生自己构造单向链表进行测试iChanProcess(pstrIn,pstrOut);/* TODO: 执行完成后可比较是否是你认为正确的值 */iChanToArray(pstrOut, iaDataMyOut, &iLenth);//printf("%d\n",pstrOut->data);//CPPUNIT_ASSERT(3 == iLenth);//CPPUNIT_ASSERT(0 == memcmp((char *)iaDataOut, (char *)iaDataMyOut, sizeof(int) * iLenth));/* 释放内存*/vFreeChan(pstrIn);vFreeChan(pstrOut);return 0;}
0 0
- 删除链表中的重复节点、剩余节点逆序输出
- 删除链表中的重复节点、剩余节点逆序输出
- 删除链表中的重复节点、剩余节点逆序输出
- 练习 删除链表中的重复节点、剩余节点逆序输出
- [华为机试练习题]24.删除链表中的重复节点、剩余节点逆序输出
- 华为机试题:删除链表中的重复节点、剩余节点逆序输出
- 逆序输出链表节点
- 删除链表中的重复节点
- 删除链表中的重复节点
- 删除有序链表中的重复节点
- 删除有序链表中的重复节点
- 实现链表的逆序输出和删除某节点
- 删除链表重复节点
- LeetCode 刷题: 删除已排序链表中的重复节点
- 删除有序链表中的重复节点2
- 面试题57:删除链表中的重复节点
- 删除链表重复节点-java
- 删除排序链表的重复节点
- [leetcode] 130 surrounded regions dfs bfs
- Java多线程---Lock类
- 设计模式--UML关系与代码对照
- 考试终于结束了
- JQuery中的事件
- 删除链表中的重复节点、剩余节点逆序输出
- 黑马程序员——C语言——结构体与枚举
- 关于Android设备屏幕大小及密度的系统参数类
- [C++]LeetCode: 84 Generate Parentheses (卡特兰数)
- CentOS上安装Oracle XE指南
- android webView参数
- 回顾2014
- android中Invalidate方法
- Web前端 bom 头 <feff>的问题