对于数据结构,一直都没有怎么用,但是在面试时一直都会出现。
面试题- 链表
(1)写一个函数将一个链表逆序.
(2)一个单链表,不知道长度,写一个函数快速找到中间节点的位置.
(3)写一个函数找出一个单向链表的倒数第n个节点的指针.(把能想到的最好算法写出).
#include "stdafx.h"
#include <iostream>
#include <math.h>
using namespace std;
struct MyStruct
{
int data;
MyStruct *pNext;
};
MyStruct* CreateList(int* p, int len);
MyStruct* PositiveList(MyStruct* pHead);
MyStruct* FindMidNode(MyStruct* pHead);
MyStruct* FindEndIndex(MyStruct* pHead,int nNode);
int main()
{
int a[8] = {1,2,3,4,5,6,7,8};
MyStruct *pHead = NULL;
//创建链表时就让它逆序
pHead = CreateList(a, 8);
//逆序输出 5-1
MyStruct *pPriData= pHead;
while(pPriData != NULL)
{
cout<<"value: "<<pPriData->data<<endl;
pPriData = pPriData->pNext;
}
//正序输出1-5
cout<<endl;
cout<<"正序输出"<<endl;
MyStruct *pData = PositiveList(pHead);
pPriData = pData;
while (pPriData != NULL)
{
cout<<"value: "<<pPriData->data<<endl;
pPriData = pPriData->pNext;
}
//查找中间的节点
pPriData = FindMidNode(pHead);
cout<<"位置为: "<<&pPriData<<"数据为:"<<pPriData->data<<endl;
//查找倒数的节点的数据
int nNode;
cout<<"输入要查看的节点"<<endl;
cin >>nNode;
pPriData = FindEndIndex(pHead,nNode);
system("pause");
return 1;
}
MyStruct* FindEndIndex(MyStruct* pHead,int nNode)
{
//先让pEnd - pBegin = nNode(他们之家的差距)
MyStruct* pBegin = pHead;
MyStruct* pEnd = pHead;
//如果是1就是最后一个节点
if(nNode == 1)
{
while(pBegin->pNext != NULL)
{
pBegin = pBegin->pNext;
}
return pBegin;
}
else
{
for(int i =0; i< nNode-1; i++)
{
pEnd= pEnd->pNext;
}
while(pEnd->pNext != NULL)
{
pEnd = pEnd->pNext;
pBegin = pBegin->pNext;
}
return pBegin;
}
}
MyStruct* FindMidNode(MyStruct* pHead)
{
MyStruct* pSercher = pHead;
MyStruct* pMid = pHead;
while(pSercher->pNext != NULL)
{
pSercher = pSercher->pNext->pNext;
if(pSercher == NULL)
{
break;
}
pMid = pMid->pNext;
}
return pMid;
}
MyStruct* PositiveList(MyStruct* pHead)
{
MyStruct *pReturn = NULL;
MyStruct *pData = NULL;
while(pHead != NULL)
{
MyStruct *pTemp = new MyStruct;
pTemp->data = pHead->data;
pTemp->pNext = NULL;
if(pReturn == NULL)
{
pReturn = pTemp;
}
else
{
pTemp->pNext = pReturn;
pReturn = pTemp;
}
pHead = pHead->pNext;
}
return pReturn;
}
MyStruct* CreateList(int* p,int len)
{
MyStruct *pHead = NULL;
MyStruct *pTemp = NULL;
for(int i =0; i < len; i++)
{
pTemp = new MyStruct;
pTemp->data = i;
pTemp->pNext = NULL;
if(pHead == NULL)
{
pHead = pTemp;
}
else
{
pTemp->pNext = pHead;
pHead= pTemp;
}
}
return pHead;
}
我在自己的电脑上验证通过了,如果感觉思路不好,请给我留言。您的留言是我前进的动力!