单链表反转的算法代码实现

这是一道简单的算法题。

题目如下:

单链表,反转前:
node_1 -> node_2 -> node_3 -> node_4 -> node_5,其中指针pHead指向头节点node_1
反转后:
node_5 -> node_4 -> node_3 -> node_2 -> node_1,其中指针pHead指向头节点node_5


关键点:

共计使用3个指针完成反转,除头节点指针pHead外,创建2个指针p1,p2,
p1作用:指向未参与反转的下一个节点,确保后续链表不会丢失
p2作用:指向当前正参与反转的节点,将其next指针指向前一个节点

代码实现如下:
// 定义单链表节点
Struct {
    int key; // 节点存储的值
    Node *next; // 指向下一个节点
} Node;

void reverse(Node *pHead) {
    if (null == pHead) {
        return;
    }

    Node *p1 = pHead->next;
    pHead->next = null; // 此时的头节点将作为单链表最后一个节点,所以指向为null
    Node *p2 = p1;

    while (null != p1->next) {
        p1 = p1->next; // p1指向下一个节点,不参与此轮循环内的反转
        p2->next = pHead; // p2反转当前节点,指向上一节点
        pHead = p2; // pHead指向新的单链表头节点
        p2 = p1; // p2指向p1,此节点将参与下轮循环的反转
    }
}



作者:kevin song,2018.11.25于南京建邺区

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 链表问题是面试过程中经常被问到的一部分,很考查编程功底。最近刷了 LeetCode 上链表部分的面试题,我总结了一...
    JohnnyShieh阅读 10,447评论 0 9
  • 作为一个资深的新手程序员😂,链表这些既基础又深奥的东西是日常工作中并不常见,但是却非常重要,所以就总结一下链表的简...
    Clark_new阅读 9,831评论 4 12
  • 友情提示:如果读者感觉文章有点难懂,可以看一下前期我所写的财务管理知识。(此系列6最好结合系列5来看,能够加深理解...
    两粒米阅读 5,057评论 0 10
  • 做了道选择题,有个选项是这样的 如果在一个线程构造了一个不可变对象之后(对象仅包含final字段),就可以保证了这...
    抓兔子的猫阅读 6,655评论 0 1
  • 索引是一种特殊的文件(InnoDB 数据表上的索引是表空间的一个组成部分),它们包含着对数据表里的所有记录的引用指...
    QxQx阅读 5,573评论 0 2

友情链接更多精彩内容