woshiyyp
2017-10-10 09:21
采纳率: 50%
浏览 2.2k
已采纳

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

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,看不懂其中指针的变化

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

6条回答 默认 最新

  • CoverageFeng 2017-10-10 11:22
    已采纳

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

    点赞 打赏 评论
  • blownewbee 2017-10-10 09:43
     <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
    
    点赞 打赏 评论
  • 盗墓者是个丑奴儿 2017-10-10 09:51

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

    点赞 打赏 评论
  • ypbck 2017-10-10 10:08

    很简单呀,链表反转也就是头变尾,尾变头。函数一开始传入的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
    这样讲懂不

    点赞 打赏 评论
  • testgirl1 2017-10-10 11:50

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

    点赞 打赏 评论
  • Blank_spaces 2017-10-10 16:38

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

    点赞 打赏 评论

相关推荐 更多相似问题