ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

LeetCode 206. 反转链表

2020-01-14 14:38:01  阅读:343  来源: 互联网

标签:head ListNode 206 反转 结点 next 链表 LeetCode


反转链表


题目

  • 反转一个单链表。

示例:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?

问题分析:这里若是一个数组,倒序输出就ok了,但是单链表不能倒序输出,只能前一个结点指向后一个结点。进阶中要求两种方法反转链表,下面用分析迭代和递归解题思路。

解题思路:反转链表,我们想着可以用指针遍历单链表,并把每次遍历的元素头插法添加到另一种数据结构中,输出这个数据结构即可,这个方法就是迭代法思想。具体的,依旧是用单链表数据结构,创建一个虚拟头结点,然后用临时变量p遍历已知链表,复制一份遍历的元素头插法添加到新链表中,p往后移,直到p为null为止,最终返回虚拟头结点的下一个结点,因为函数返回值应为真实头结点。

迭代法代码实现

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode reverseList(ListNode head) {
        if(head==null||head.next==null){
            return head;
        }
        //迭代实现
        ListNode virHead=new ListNode(0);
        ListNode p=head;
        while(p!=null){
            ListNode n=new ListNode(p.val);
            n.next=virHead.next;
            virHead.next=n;
            p=p.next;
        }
        return virHead.next;
        }
 }

递归实现:递归思想的是将大问题转化成小问题。

说一下链表的递归性,在下面这个链表头插法插入元素时,以实头结点来说,一般是在元素1后面插入元素,此时是把1这个结点看做头结点,当把元素2结点看做头结点,头插法就是在2和3之间操作,此时链表就是2~5,不包括1,同样3,4,5做头结点也是一样的,也就是说在单链表中每个结点都可以做它其后的头结点,这就是链表的递归性。

递归是将大问题化成小问题,对上面这个链表分析,要把1~5反转,先将2-5反转,把1放到最后,继续,要把2-5反转,先将3-5反转,再将2放到最后,以此类推,最后只要反转8。图形描述如下:

递归思路已经出来了,具体做法:首先递归找到最小问题反转5,即递归调用自己,让分解的小问题函数全部进栈

此时函数全部进栈,反转5,还就是5,反转后的结果放在h变量中,该函数弹栈。接下来是执行反转4->5函数,头结点head就是4,变量h始终指向5,反转操作:head.next指针域指向4,也就是head的地址即可,此时5->4,再断开4->5,4的指针域指向null,函数弹栈,接下来3调用4->5的反转。注意:这里不能用h.next=head,因为对于h始终是反转链表的头结点5,对于4是可以的,对于3就会把3放到5后面,顺序乱了。

递归法代码实现

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode reverseList(ListNode head) {
        if(head==null||head.next==null){
            return head;
        }
        //递归实现
        ListNode h=reverseList(head.next);
        head.next.next=head;
        head.next=null;
        return h;
        }
}
~inspire 发布了59 篇原创文章 · 获赞 45 · 访问量 1299 私信 关注

标签:head,ListNode,206,反转,结点,next,链表,LeetCode
来源: https://blog.csdn.net/qq_43624033/article/details/103751156

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有