链表反转问题,看不懂其中指针的方向

class Solution {
public:
/**
* @param head: The first node of linked list.
* @return: The new head of reversed linked list.
*/
ListNode *reverse(ListNode *head) {
ListNode *prev = NULL;
while (head != NULL) {
ListNode *temp = head->next;
head->next = prev;
prev = head;
head = temp;
}
return prev;
}
};
求帮忙把这个转化成图形连接,实在看不懂其中的逻辑,尤其是 head->next = prev,prev=head,head =temp,看不懂其中指针的变化

手头没有markdown只有笔和纸,楼主见谅图片说明34538_168767.jpg)图片说明图片说明

 <node1 next=node2> -> <node2 next=node3> -> <node3 ...>
 prev = node1
head = node2
ListNode *temp = head->next; 此时temp=node3
head->next = prev; 此时node2的下一个指向node1
这时其实颠倒已经完成,现在的是:
<node2 next=node3> -> <node1 next=node2> -> <node3 ...>
prev = head; 此时pre = node2
head = temp; 此时head = node3
这样下一轮交换node2 node3

这个是c语言的链表?和java语法略有不同,稍稍看了看还是差不多能看懂的。在java中链表中的双链:是申请长度为3的数组,一个存数据,一个存上一个数组数据的引用,一个存下一个数组数据的引用。头尾引用
单链是一个存下一家的引用,一个存数据,头尾引用,
不论是单链还是双链都是通过引用做的,如果c和java链表原理差不多,可以参考我的文章http://blog.csdn.net/Java_Dmz/article/details/78115435

很简单呀,链表反转也就是头变尾,尾变头。函数一开始传入的head是链表头,待会儿它会变成尾巴,从它开始,首先用temp记录它的后继(不然待会儿设置head后继以后就找不到链表其他节点了),然后将head的后继设置为prev(他是谁待会儿讨论),然后用prev记录当前的prev,然后head后移一个(也就是把刚才记录的temp赋值给head)。本次循环结束后,prev是当前head的前驱。所以其实prev就是head的前驱(刚开始它为null,但是,这时head事表头呀。它的前驱可以看做null)。
通俗点说,假设现在有四个节点(编号1-4),head为头,如何反转?首先记住2号(temp),然后将1号的后继设为null(因为反转后它是尾巴呀),然后令prev为head(1号)head为temp(2号),然后将temp设为3(head–>next),将prev赋给head的next,注意注意,这个时候,链表已经不是由1指向2了,而是2指向1,然后3被temp记录着,当然我们还想让3指向2,那么和上面一样,head赋给prev,temp赋给head,让head再前进为3,那么prev 为2,这时令head--> next =prev就可以得到3指向2,再来一次,岂不就4指向3咯,而且此时4已经是末尾了,那它就变成了新的表头了4-3-2-1
这样讲懂不

链表翻转第一次看也是不懂,为什么有nullptr。后来看明白了。你可以这么理解,首先prev总是翻转后的头指针,所以第一次执行翻转后的链表只有一个元素,该元素的next为空。
temp是为了找到剩下没有翻转链表的头head。在继续执行循环,相当于在表头插入元素。
照片太大,上传不了

您好,你可以看一下啊我的博客,有写这个问题的