记录地址,逆序链接

struct ListNode* ReverseList(struct ListNode* pHead) {
    if (pHead == NULL) {
        return pHead;
    }
    struct ListNode *pTemp = pHead->next;
    // 统计节点个数
    int count = 1;
    while (pTemp) {
        count++;
        pTemp = pTemp->next;
    }
    // 创建指针数组
    struct ListNode * addrs[count];
    pTemp = pHead;
    for (int i = 0; i < count; i++) {
        addrs[i] = pTemp;
        pTemp = pTemp->next;
    }
    // 逆序链接
    for (int i = count-1; i > 0; i--) {
        addrs[i]->next = addrs[i-1];
    }
    addrs[0]->next = NULL;
    return addrs[count-1];
}

迭代

struct ListNode* ReverseList(struct ListNode* pHead) {
    struct ListNode* pPrev = NULL; // 初始化为 NULL
    struct ListNode* pCurr = pHead; // 从 pHead 开始
    struct ListNode* pNext;
    while (pCurr) {
        pNext = pCurr->next; // 在反转前先记录后一节点
        pCurr->next = pPrev; // 核心操作:指向前一节点
        pPrev = pCurr; // 准备下一轮
        pCurr = pNext; // 准备下一轮
    }
    return pPrev; // pCurr 为 NULL 时,pPrev 即为反转过后的头节点
}

递归(一)

struct ListNode* ReverseListCore(struct ListNode* pCurr, struct ListNode* pPrev) {
    if (pCurr == NULL)
        return pPrev;
    struct ListNode* pNext = pCurr->next; // 记录下一节点
    pCurr->next = pPrev; // 反转
    return ReverseListCore(pNext, pCurr); // 对下一节点进行反转
}

struct ListNode* ReverseList(struct ListNode* pHead) {
    return ReverseListCore(pHead, NULL);
}

递归(二)

struct ListNode* ReverseList(struct ListNode* pHead) {
    if (pHead == NULL || pHead->next == NULL) {
        return pHead;
    }
    struct ListNode* newHead = ReverseList(pHead->next);
    pHead->next->next = pHead;
    pHead->next = NULL;
    return newHead;
}