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

京公网安备 11010502036488号