19 反转链表
程序员面试精选类博客题目出自何海涛的网易博客,本博客只记录自己的实现,以供学习。
题目:输入一个链表的头结点,反转该链表,并返回反转后链表的头结点。链表结点定义如下:
struct ListNode { int m_nKey; ListNode* m_pNext; };
分析:可以将链表表示为如下形式:

逆置操作相当于每次操作pCur节点,并将其next指向pPre,这样直到链表尾。

个人实现:
无头节点的链表反转实现:
//输入一个链表的头结点,反转该链表,并返回反转后链表的头结点 ListNode* ReverseList(ListNode* head) { assert(head); ListNode* pPer = head; ListNode* pCur = head->m_pNext; while(pCur) { ListNode* pNext = pCur->m_pNext; pCur->m_pNext = pPer; pPer = pCur; pCur = pNext; } head->m_pNext=NULL; return pPer; }
其效果为:
原链表:
逆置后:![]()
带头节点的链表反转实现:
//输入一个链表的头结点,反转该链表,并返回反转后链表的头结点 ListNode* ReverseListWithHeadNode(ListNode* head) { if(!head || !(head->m_pNext)) return head; ListNode* pPer = head; ListNode* pCur = head->m_pNext; while(pCur) { ListNode* pNext = pCur->m_pNext; pCur->m_pNext = pPer; pPer = pCur; pCur = pNext; } //将最后节点(原第一个节点)的next指向null head->m_pNext->m_pNext = NULL; //头节点next指向第一节点(原最后一个) head->m_pNext=pPer; return head; }
原链表:
逆置后: 
浙公网安备 33010602011771号