算法通关村第二关——我终于学会链表反转了

链表反转的意义

        反转链表涉及到节点的增加、删除等多种操作,能非常有效地考察思维能力和代码驾驭能力。另外,很多题目也以它来做基础,例如指定区间反转,链表K个一组反转等;除此之外,还有一些在内部的某个过程用到了反转,例如两个链表生成相加链表;最后还有链表排序。

必须掌握的两种链表反转 

  1. 带虚拟头节点的链表反转
  2. 不带虚拟头节点的链表反转

题目描述

给你单链表的头节点head,请你反转链表,并返回反转后的链表

示例:

输入:head = [1,2,3,4,5]

输出:[5,4,3,2,1]

图示

题目所要效果如下图所示

image.png

 实现方式

1.带虚拟头节点的链表反转 
解题思路

        虚拟头节点能够解决链表头节点的处理问题(如判空等),建立一个虚拟头节点ans,并将虚拟头节点与旧的头节点产生关系(ans.next = 旧的头节点),接下来就可将旧的链表通过旧的头节点一步一步拆下来并接到虚拟头节点ans后面

思路图例

实现步骤如下:

image.png

 

代码实现
public Node reverseList(Node head){
    Node ans = new Node(0);
    Node cur = head;
    
    while(cur != null){
        Node next = cur.next;
        cur.next = ans.next;
        ans.next = cur;
        cur = next;
    }
    return ans.next;
}
2.带虚拟头节点的链表反转 
实现思路

也是通过拆分链表节点的方式实现的。定义一个空的链表头节点(不是虚拟节点,其值为null),然后将旧的链表节点通过拆分的方式接入这个空的链表头节点中。

思路图例

实现效果图:

image.png

节点4的执行过程图:

image.png

 

代码实现 
public Node reverseList(Node head){
    Node pre = null;
    Node cur = head;
    
    while(cur != null){
        Node next = cur.next;
        cur.next = pre;
        pre = cur;
        cur = next;
    }
    
    return pre;
}

至此结束,OVER!!! 掌握咯 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值