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

作者: kevinsong0810 | 来源:发表于2018-11-25 14:30 被阅读1次

    这是一道简单的算法题。

    题目如下:

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

    相关文章

      网友评论

        本文标题:单链表反转的算法代码实现

        本文链接:https://www.haomeiwen.com/subject/rujpqqtx.html