蓝桥杯入门即劝退(十)反转链表

----------持续更新蓝桥杯入门系列算法实例------------

如果你也喜欢Java和算法,欢迎订阅专栏共同学习交流!

你的点赞、关注、评论、是我创作的动力!

-------希望我的文章对你有所帮助--------

前言:如果有一定链表基础,来学习本篇文章的实例将更好理解哦!

一、反转链表 I

题目描述

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

示例 1:

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

示例 2:

输入:head = [1,2]
输出:[2,1]

示例 3:

输入:head = []
输出:[]

解题思路:1、本题的目标很明确,就是对整个链表进行反转,通过对于链表元素进行操作,而不是改变其Value!

2、本题较为容易理解的就是使用双指针法,即创建一个pre指针,且赋值为null,一个cur指针,表示指向当前元素。

3、首先,将cur指针初始化指向head头指针,其次再创建一个next节点,赋值为cur.next

4、其实这个next节点表示的是指向head指针的下一个元素!

5、再将cur.next指针指向pre,即改变了head的指针方向(抽象上)

6、再次,将cru赋值给pre,即完成了一次反转,最后再使得cur赋值给next,开始下一次反转

7、最后返回pre,即完成全部反转!

8、动图演示:

(图中pre为本题中的cur,原理其实一样)

 

代码实现

public static ListNode reverseList(ListNode head) {
     ListNode pre=null;
     ListNode cru=head;
     while (cru!=null){
         ListNode next=cru.next;
         cru.next=pre;
         pre=cru;
         cru=next;
     }
     return pre;
    }

二、反转链表II

题目描述

给你单链表的头指针 head 和两个整数 leftright ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表

示例 1:

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

示例 2:

输入:head = [5], left = 1, right = 1
输出:[5]

解题思路:1、本题是上一题的升级版,如果学会第一题,那么第二题则是会更加的得心应手

2、本题是对于部分的链表元素的反转,难度加大

3、需要确定反转链表的位置,即left和right

4、首先创建一个虚拟头节点,赋值为-1,因为head可能是变化的,并且指向head。

5、将头节点赋值给pre,并且开始遍历链表直到 left-1的位置,并且记录给RightNode节点

6、再次移动RightNode,到right+1 的位置,并且记录当前指针位置

7、开始切割,即将left到right这段链表的前一个next指针和后一个next指针置空!

8、再通过相同的方式,如第一题般反转链表

9、将反转的链表拼装回去,即可得到局部反转的链表,最后返回虚拟节点的下一个节点(head)

请问你学废了吗?

代码实现

 public ListNode reverseBetween(ListNode head, int left, int right) {
        ListNode D_Node=new ListNode(-1);//虚拟节点
        D_Node.next=head;
        ListNode pre=D_Node;
        for(int i=0;i<left-1;i++){//移到left前一个next指针
            pre=pre.next;
        }
        ListNode RigthNode=pre;//记录当前位置继续遍历
        for (int i=0;i<right-left+1;i++){
            RigthNode=RigthNode.next;
        }
        ListNode LeftNode=pre.next;//链表左端
        ListNode cur=RigthNode.next;//链表右端
        pre.next=null;//切割
        RigthNode.next=null;
        ReverseList(LeftNode);//反转

        pre.next=RigthNode;//拼接
        LeftNode.next=cur;

        return D_Node.next;

    }
    public  static ListNode ReverseList(ListNode head1){
        ListNode pre=null;
        ListNode cru=head1;
        while (cru!=null){
            ListNode next=cru.next;
            cru.next=pre;
            pre=cru;
            cru=next;
        }
        return pre;
    }

感谢爱学习的你看到了最后,点个关注、赞支持一下吧!

评论 43
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kook小辉的进阶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值