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

这是一道简单的算法题。

题目如下:

单链表,反转前:
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于南京建邺区

    原文作者:kevinsong0810
    原文地址: https://www.jianshu.com/p/de11c0abe7b0
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞