Question: Define a function, enter the head node of a linked list, reverse the linked list, and output the head node of the reverse linked list.
Linked List node definition:
struct ListNode{int m_nValue ;ListNode* m_pNext ;} ;
At the beginning, I first thought about recursive solutions:
ListNode * ReverseLinkedList (ListNode * pListHead) {if (NULL = pListHead) {return NULL;} else if (NULL = pListHead-> m_pNext) // only one node {return pListHead;} ListNode * pNewHead = ReverseLinkedListCore (pListHead, NULL); return pNewHead;} ListNode * ReverseLinkedListCore (ListNode * pCurNode, ListNode * pPrevNode) {if (NULL = pCurNode) {return NULL;} if (NULL = pCurNode-> m_pNext) // to the last node {pCurNode-> m_pNext = pPrevNode; // start to reverse the linked list return pCurNode; // The Last node is the new header node} else {ListNode * pNewHead = ReverseLinkedListCore (pCurNode-> m_pNext, pCurNode ); pCurNode-> m_pNext = pPrevNode; return pNewHead ;}}
The solution in the book is non-recursive, more direct and concise:
ListNode * ReverseList (ListNode * pHead) {ListNode * pReversedHead = NULL; ListNode * pNode = pHead; ListNode * pPrev = NULL; while (pNode! = NULL) {ListNode * pNext = pNode-> m_pNext; if (pNext = NULL) // there is only one node {pReversedHead = pNode;} pNode-> m_pNext = pPrev; pPrev = pNode; pNode = pNext;} return pReversedHead ;}