user-0 提问: 单向链表的逆置问题

回复:
user: user-0
content: 引用 7 楼 寻开心 的回复:head本来就是空的头结点，函数结束的时候， head->next要指向原来的尾巴， 然后head依然是整个链表的头结点，无需返回。  进入while之前的那几个指针的初始化，如上一个回复可以看到， 你肯定是弄错了， 那样初始化后while都不能执行，pt已经是NULL了  你的pT，pR，pA分别代表什么意思？ 说明一下 我给你的代码当中， pPrev代表前一个节点，pT当前节点，pNext下一个节点，变量名可以提现出来  进入while循环到时候，你是假定当前状态是什么， 三个指针各自代表什么意思，处于什么状态 一个循环完了，三个指针是否还继续保持有效状态， 这个解决了while里面的代码才是完整的  void ListReverse(LinkNode * pHead ) {     if (pHead ==NULL || pHead->next==NULL ) return; // 如果head是空，或者只有一个有效节点，无需反转     LinkNode * pPrev=NULL, * pNext=NULL;  // 当前要处理的节点的上一个和下一个节点     LinkNode * pT = pHead->next;                  // 当前节点是第一个有效的节点     pHead->next=NULL;                                 // 这句可以没有， 加它只是表明在中间处理状态下，先断掉头     // 至此pT是当前有效节点， pPrev是NULL节点——显然反转后pT是尾巴了，尾巴的下一个节点必须是NULL      while ( pT->next ) {   // 当前节点不是原来的尾巴节点的时候，pT->next就不是NULL         pNext = pT->next;          // 临时保存         pT->next = pPrev;          // 当前节点的下一个节点，要指向原来的上一个节点         pPrev = pT;                    // 反转完成，为下一次循环准备初始变量。 当前节点成为了下一次循环当中的上一个节点         pT = pNext;                   //  下一次循环当中的当前节点就是前面临时保存的节点     }     // 执行到这里的时候， pT是原来链表的尾巴节点了， pRrev仍然是上一个处理完的有效节点     pT->next=pPrev;                 pHead->next = pT;      // 把原来的尾巴节点--反转后的第一个有效节点，挂接到head下 }非常感谢

user: user-1
content: head本来就是空的头结点，函数结束的时候， head->next要指向原来的尾巴， 然后head依然是整个链表的头结点，无需返回。  进入while之前的那几个指针的初始化，如上一个回复可以看到， 你肯定是弄错了， 那样初始化后while都不能执行，pt已经是NULL了  你的pT，pR，pA分别代表什么意思？ 说明一下 我给你的代码当中， pPrev代表前一个节点，pT当前节点，pNext下一个节点，变量名可以提现出来  进入while循环到时候，你是假定当前状态是什么， 三个指针各自代表什么意思，处于什么状态 一个循环完了，三个指针是否还继续保持有效状态， 这个解决了while里面的代码才是完整的  void ListReverse(LinkNode * pHead ) {     if (pHead ==NULL || pHead->next==NULL ) return; // 如果head是空，或者只有一个有效节点，无需反转     LinkNode * pPrev=NULL, * pNext=NULL;  // 当前要处理的节点的上一个和下一个节点     LinkNode * pT = pHead->next;                  // 当前节点是第一个有效的节点     pHead->next=NULL;                                 // 这句可以没有， 加它只是表明在中间处理状态下，先断掉头     // 至此pT是当前有效节点， pPrev是NULL节点——显然反转后pT是尾巴了，尾巴的下一个节点必须是NULL      while ( pT->next ) {   // 当前节点不是原来的尾巴节点的时候，pT->next就不是NULL         pNext = pT->next;          // 临时保存         pT->next = pPrev;          // 当前节点的下一个节点，要指向原来的上一个节点         pPrev = pT;                    // 反转完成，为下一次循环准备初始变量。 当前节点成为了下一次循环当中的上一个节点         pT = pNext;                   //  下一次循环当中的当前节点就是前面临时保存的节点     }     // 执行到这里的时候， pT是原来链表的尾巴节点了， pRrev仍然是上一个处理完的有效节点     pT->next=pPrev;                 pHead->next = pT;      // 把原来的尾巴节点--反转后的第一个有效节点，挂接到head下 }

user: user-0
content: 引用 5 楼 寻开心 的回复: 换下位置，但是整个函数还是等一会自动退出，用输出函数无法输出没反应后自动结束了

user: user-1

user: user-0
content: 引用 3 楼 寻开心 的回复:void ListReverse(LinkNode * pHead ) {     if (pHead ==NULL || pHead->next==NULL ) return;     LinkNode * pPrev=NULL, * pNext=NULL;     LinkNode * pT = pHead->next;     pHead->next=NULL;      while ( pT->next ) {         pNext = pT->next;         pT->next = pPrev;         pPrev = pT;         pT = pNext;     }     pT->next=pPrev;     pHead->next = pT; } 大概是这么个东西吧 逆置函数：pa直接代表了头节点的下一个节点（头节点中data没有值），第二个节点后续作为尾节点，所以设为NULL，pt指向第三个节点，pr指向pt。循环中pt进入第四个节点。然后pr为第三个节点，需要把第二个节点（后续的尾节点）地址传给第三个的next；然后都在进一位，依次类推。最后pt出来为空（疑问：pt的data，next均为空？），都为空的话是不是可以直接让pt作为头节点，所以pt->next=pa；链接起来。哪里错了？

user: user-1
content: void ListReverse(LinkNode * pHead ) {     if (pHead ==NULL || pHead->next==NULL ) return;     LinkNode * pPrev=NULL, * pNext=NULL;     LinkNode * pT = pHead->next;     pHead->next=NULL;      while ( pT->next ) {         pNext = pT->next;         pT->next = pPrev;         pPrev = pT;         pT = pNext;     }     pT->next=pPrev;     pHead->next = pT; } 大概是这么个东西吧

user: user-1
content: head本来就是空的头结点， 倒置之后，让head的next指向原来的尾巴就好了。 不能再弄一个新的出来

user: user-1
content: 上来就while（pt！=NULL） 问题是你的pt还没有初值呢