题解 | #反转链表#

反转链表

https://www.nowcoder.com/practice/75e878df47f24fdc9dc3e400ec6058ca

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

/**
 * 
 * @param pHead ListNode类 
 * @return ListNode类
 */
struct ListNode* ReverseList(struct ListNode* pHead ) {
    if(pHead==NULL) return NULL;//肯定是先判空
    struct ListNode* RL = (struct ListNode*)malloc(sizeof(struct ListNode));
    RL->next=NULL;
    struct ListNode*p;
    p=pHead;
    while(p){//首先第一个头节点走空,从下一个开始传值。
        struct ListNode*q =p->next;
        p->next=RL->next;//这里使用的是头插发,先把有值的插入,
        RL->next=p;
        p=q; //把p值后移一位
    }
    return RL->next;
    //这里为什么要返回RL->next,因为每次判断都是在RL->next=p;p=q;之后进行,当p空时,此时RL->next并没空,也就是Rl在目前是空节点,而RL->next是有实际值的,所以要返回next;
    //这里是头插法

}

反转链表的考察,3个变量构建,一个链式存储结果链表,另一个充当转换,就相当于变量替代,目的是把原题地址拿到函数内部运算,以防发生内存错误,在循环体中,构建新的变量q,目的就是一个指当前,另一个指next,可以理解为2个变量的交换操作需要一个temp做中间体,然后要注意循环结束时的RL情况,对链表存储情况进行判断,最后返回第一个值节点。

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务