19 反转链表

程序员面试精选类博客题目出自何海涛的网易博客,本博客只记录自己的实现,以供学习。

传送门:程序员面试题精选100题(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;
}

原链表:

逆置后: 

 

 

posted @ 2012-08-27 14:29  t427  阅读(214)  评论(0)    收藏  举报