反转单向链表分为递归和非递归两种方式。递归的实现方式比较简单,而非递归实现效率较高,在面试时应注意边界条件。
这道题在面试时被要求现场作答的概率还是很大的,比较tricky的地方就是要在当前条件下保存好next of next的指针,如果一时想不起来程序怎么写,可以先自己画个图看看。
- // ReverseList.cpp : Defines the entry point for the console application.
- //
- #include "stdafx.h"
- enum{N = 3};
- class Node
- {
- public:
- Node* pNext;
- int var;
- Node(int i):pNext(NULL), var(i){}
- };
- void helper(Node* pHead, Node*& reverseHead)
- {
- if(pHead->pNext->pNext != NULL)
- helper(pHead->pNext, reverseHead);
- else
- reverseHead = pHead->pNext;
- pHead->pNext->pNext = pHead;
- }
- Node* ReverseList(Node* pHead)
- {
- if(NULL == pHead || NULL == pHead->pNext)
- return NULL;
- Node* reverseHead = NULL;
- helper(pHead, reverseHead);
- pHead->pNext = NULL;
- return reverseHead;
- }
- Node* ReverseListNonRecursive(Node* pHead)
- {
- if(NULL == pHead || NULL == pHead->pNext)
- {
- return NULL;
- }
- Node* N1 = pHead->pNext;
- Node* N2 = pHead->pNext->pNext;
- if(NULL == N2)
- {
- N1->pNext = pHead;
- pHead->pNext = NULL;
- }
- else
- {
- Node* t = pHead;
- while (NULL != N2)
- {
- N1->pNext = pHead;
- pHead = N1;
- N1 = N2;
- N2 = N2->pNext;
- }
- N1->pNext = pHead;
- t->pNext = NULL;
- }
- return N1;
- }
- void PrintNode(Node* pHead)
- {
- while (pHead != NULL)
- {
- printf("%d ",pHead->var);
- pHead = pHead->pNext;
- }
- printf("\r\n");
- }
- void Test()
- {
- Node* pHead = new Node(0);
- Node* pNode = pHead;
- for(int i = 1; i < N; i++)
- {
- Node* pNext = new Node(i);
- pNode->pNext = pNext;
- pNode = pNode->pNext;
- }
- PrintNode(pHead);
- //Node* reversedHead = ReverseListNonRecursive(pHead);
- Node* reversedHead = ReverseList(pHead);
- PrintNode(reversedHead);
- }
- int _tmain(int argc, _TCHAR* argv[])
- {
- Test();
- return 0;
- }