代码改变世界

如何实现单链表的反转

2015-07-14 22:06  kaining  阅读(560)  评论(0)    收藏  举报

原理:

反转一个链表,需要调整指针的方向,而与指针操作相关代码总是容易出错的。

例如:  1、m、n是3个相邻的结点,假设经过若干步操作,已经把结点i之前的指针调整完毕,这些节点的m_pNext指针都是指向前面一个结点。现在

遍历到结点m,当然需要调整结点的m_pNext指针,让它指向结点1,但是注意的是,一旦调整了指针的指向,链表就断开了,因为已经没有指针指向

结点n,没有办法再遍历到结点n了,因此为了避免链表断开,需要在调整m的m_pNext之前要把n保存下来。接下来试着找到反转后链表的头结点,不

难分析出链表的头结点是原始链表的尾结点,即m_pNext为空指针的节点。

具体实现过程如下:

链表结点定义如下:

struct ListNode

{

  int m_nKey;

  ListNode* m_pNext;

}

ListNode* Reverselteratively(ListNode* pHead)

{

  ListNode* pReversedHead = NULL;

     ListNode* pNode = pHead;

     ListNode* pPrev = NULL;

     while(pNode != NULL)

     {

    ListNode* pNext = pNode->m_pNext;   //保存后驱节点

           if(pNext == NULL)

    {

      pReversedHead =pNode;

    }

          pNode -> m_pNext = pPrev;//将节点的指针指向前驱节点

          pPrev = pNode;//将节点变成前驱节点

         pNode = pNext;   //将保存下来的后驱节点变成节点

     }

      return pReversedHead;

}

说明: 节点分为:    前驱节点      节点      后驱节点