题解 | #反转链表#
反转链表
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情况,对链表存储情况进行判断,最后返回第一个值节点。