如何实现单链表的反转


原理:

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

例如: 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;

}

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

优质内容筛选与推荐>>
1、三层架构的搭建
2、[POI2006] OKR-period of words
3、Netty源码分析第2章(NioEventLoop)---->第7节: 处理IO事件
4、JavaScript 焦点事件
5、supervisor初试


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号