一道微软的编程题,趁午休的时间做了一下,如果有不对之处,希望指出。
#include<string>
#include<iostream>
using namespace std;
typedef struct LNode {
char m_nValue;
struct LNode* p_mNext;
}LNode;
LNode* createList(char* pStr) {
int strLen = strlen(pStr);
LNode* pHead = NULL;
LNode* pNode, *pTemp;
for (int i = 0; i < strLen; i++) {
pNode = (LNode*)malloc(sizeof(LNode));
pNode->m_nValue = pStr[i];
pNode->p_mNext = NULL;
if (NULL == pHead) {
pHead = pNode;
} else {
pTemp->p_mNext = pNode;
}
pTemp = pNode;
}
return pHead;
}
LNode* reverseList(LNode* pHead) {
if (NULL == pHead || NULL == pHead->p_mNext)
return pHead;
LNode* pNewHead = NULL;
LNode* pNode;
while (pHead) {
pNode = pHead;
pHead = pHead->p_mNext;
pNode->p_mNext = pNewHead;
pNewHead = pNode;
}
return pNewHead;
}
LNode* reorderList(LNode* pHead) {
if (NULL == pHead || NULL == pHead->p_mNext || NULL == pHead->p_mNext->p_mNext)
return pHead;
LNode* pSlow = pHead;
LNode* pFast = pHead;
while (pFast->p_mNext && pFast->p_mNext->p_mNext) {
pSlow = pSlow->p_mNext;
pFast = pFast->p_mNext->p_mNext;
}
LNode* pFirst = pHead;
LNode* pSecond = pSlow->p_mNext;
pSlow->p_mNext = NULL;
pSecond = reverseList(pSecond);
LNode *pFirstNext, *pSecondNext;
while (pSecond) {
pFirstNext = pFirst->p_mNext;
pSecondNext = pSecond->p_mNext;
pFirst->p_mNext = pSecond;
pSecond->p_mNext = pFirstNext;
pFirst = pFirstNext;
pSecond = pSecondNext;
}
return pHead;
}
void printList(LNode* pHead) {
LNode* pNode = pHead;
while (pNode) {
cout << pNode->m_nValue << " ";
pNode = pNode->p_mNext;
}
cout << endl;
}
int main(int argc, char* argv[]) {
char str[] = "abcdefghi";
LNode* pHead = createList(str);
pHead = reorderList(pHead);
printList(pHead);
cin.get();
return 0;
}