天天看点

[LeetCode] Reverse Linked List I II - 链表翻转问题

题目概述:

        reverse a singly linked list.

        翻转一个单链表,如:1->2 输出 2->1;1->2->3 输出3->2->1。

题目解析:

        本人真的比较笨啊!首先想到的方法就是通过判断链尾是否存在,再新建一个链表,每次移动head的链尾元素,并删除head链表中的元素,一个字“蠢”,但好歹ac且巩固了链表基础知识。你可能遇见的错误包括:

        1.'listnode' undeclared (first use in this function)

        nhead=(istnode*)malloc(sizeof(listnode));    

                                    =>

        nhead=(struct listnode*)malloc(sizeof(struct listnode));

        2.time limit exceeded

        在链表遍历寻找最后一个结点并插入新链表尾部中需要注意,建议的方法:

        q=head; while(q) {q=q->next;}

        p=(struct listnode*)malloc(sizeof(struct listnode));

        p->val=head->val; p->next=null; q=p;       

        q=head; while(q) {last=q; q=q->next;} 

        p->val=head->val; p->next=null; last->next=p;

        通过借助last变量更直观,否则结果总是错误。而且此时q为next指向null,如果用到q->next=p就会出现re错误,因为q都为null,哪来的q->next。第二个错误也可能是我个人的编程习惯吧!

        第二种方法更为推荐——直接翻转,还有一种递归方法自行提高。

        如下图所示,红色表示初始链表存在4个值[1, 2, 3, 4],蓝色表示初始指针first指向第一个元素、second指向第二个元素(head->next),third指向第三个元素;首先s->next=f断开链表并翻转指向第一个元素,同时f=s最后返回first。如果只有两个元素[1, 2]则执行"s->next=f; f=s;"后s=t=null返回f即可输出[2, 1]。

[LeetCode] Reverse Linked List I II - 链表翻转问题

我的代码:

直接翻转方法

"蠢"方法