首页 > 代码库 > 删除链表中的重复节点、剩余节点逆序输出

删除链表中的重复节点、剩余节点逆序输出

#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 = http://www.mamicode.com/iArrayTemp[0];>

删除链表中的重复节点、剩余节点逆序输出