天天看点

将一个链表进行反转

struct ListNode
{
    int m_nvalue;
    ListNode* m_pNext;
};
//创建链表
ListNode* CreateListNode(int value)
{
    ListNode *pNode = new ListNode();
    pNode->m_nvalue = value;
    pNode->m_pNext = NULL;

    return pNode;
}
//连接链表的两个结点
void  ConnectListNode(ListNode* pCurrent,ListNode* pNext)
{
    if(pCurrent == NULL)
    {
        cout<<"前一个节点为空:"<<endl;
        exit();
    }
    else
    {
        pCurrent->m_pNext = pNext;
    }
}
//打印链表信息
void PrintList(ListNode* pHead)
{
    ListNode *pNode = pHead;
    while(pNode != NULL)
    {
        cout<<pNode->m_nvalue <<" ";
        pNode = pNode->m_pNext ;
    }
    cout<<endl;
}

ListNode* ReverseList(ListNode* pHead)
{

    ListNode* pReverseHead = NULL;
    ListNode* pCurrentNode = pHead;
    ListNode* pPrev = NULL;  //当前结点的前一个结点
    while(pCurrentNode != NULL)
    {
        ListNode* pNext = pCurrentNode->m_pNext ; //将当前结点的下一个结点记录下来,防止链表断开

        if(pNext == NULL)
            pReverseHead = pCurrentNode;

        //将当前结点的后一个结点指向前一个结点
        pCurrentNode->m_pNext = pPrev;
        //将前一个结点指向当前结点
        pPrev = pCurrentNode;
        //将当前结点指向后一个结点
        pCurrentNode = pNext;
    }
    return pReverseHead;
}
int main()
{
    ListNode* pNode1 = CreateListNode();
    ListNode* pNode2 = CreateListNode();
    ListNode* pNode3 = CreateListNode();
    ListNode* pNode4 = CreateListNode();
    ListNode* pNode5 = CreateListNode();
    ListNode* pNode6 = CreateListNode();
    ListNode* pNode7 = CreateListNode();

    ConnectListNode(pNode1,pNode2);
    ConnectListNode(pNode2,pNode3);
    ConnectListNode(pNode3,pNode4);
    ConnectListNode(pNode4,pNode5);
    ConnectListNode(pNode5,pNode6);
    ConnectListNode(pNode6,pNode7);

    PrintList(pNode1);

    ListNode* pNode = ReverseList(pNode1);
    PrintList(pNode);
}
           

继续阅读