翻转链表如果是需要在本地翻转,则通常需要设置多个指针来实现;如果对内存没有要求,则可以新建立一个链表,将原始链表通过头插法插入新链表中

1 使用新链表头插法

/**
 * struct ListNode {
 *    int val;
 *    struct ListNode *next;
 * };
 */

/**
 * 
 * @param pHead ListNode类 
 * @return ListNode类
 */


struct ListNode* ReverseList(struct ListNode* pHead ) {
    // write code here

     if (pHead == NULL) {
        return NULL;
    }
    //创建新链表
    struct ListNode* pRes = NULL, *q = pRes;
    struct ListNode* p = pHead;

    //遍历初始列表,并使用头插法插入新链表中
    while (p) {
        q = pRes;

        pRes = (struct ListNode*)malloc(sizeof(struct ListNode));
        if (pRes == NULL) {
            break;
        }
        pRes->val = p->val;
        pRes->next = q;

        p = p->next;

    }

    //返回新链表头部
    return pRes;


}