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;

}

原链表:

逆置后: 

 

 

你可能感兴趣的:(链表)