当前位置: 首页 > news >正文

【刷题】【力扣牛客】反转链表的五种方式——Java

文章目录

  • 前言
  • 方法一:构造新链表(构造新节点)
  • 方法二:构造新链表(不构造新节点)
  • 方法三:递归
  • 方法四:双指针
  • 方法五:遍历
  • 总结


力扣题目链接:206. 反转链表
牛客题目链接:BM1 反转链表

前言

反转链表作为链表操作的基础是重中之重,以后做比较难的链表题目也可能会需要嵌入反转链表的代码,所以一定要多多练习


方法一:构造新链表(构造新节点)

思路:构造一个新的链表,从旧链表依次拿到每个节点,根据旧链表创建新节点添加至新链表头部,完成后新链表是倒序的

public ListNode reverseList (ListNode head) {//新链表的头节点,还没有元素,定义为nullListNode n1 = null;  //设置一个指针,用来遍历旧链表ListNode p = head;//循环遍历旧链表while(p != null){//根据旧链表的值创建新节点,把新节点的next指针设置为新链表的头节点,并更新新链表的头节点n1 =  new ListNode(p.val,n1);p = p.next;}//返回新链表的头节点return n1;
}

方法二:构造新链表(不构造新节点)

与方法一类似,构造一个新链表,从旧链表头部移除节点,添加到新链表头部,完成后新链表是倒序的————是不是看完后很蒙,和方法一一样啊,方法一是根据旧链表的值构造节点,方法二是直接使用旧链表的节点,没有创建新的节点

public ListNode reverseList (ListNode head) {ListNode p1 = head;ListNode p2 = null;while(true){//记录旧链表的头指针ListNode first = head;//如果旧链表的指针指向null就退出循环if(first == null){break;}//旧链表向前一步head = head.next;//将旧链表的头指针指向新链表的头first.next = p2;//更新新链表的头指针p2 = first;}return p2;
}

方法三:递归

递归,找到并返回最后一个节点记录为新节点,从倒数第二个开始,将后一个节点的指针指向自己(也就是p.next.next = p),再将自己的next指向null,避免死循环

public ListNode reverseList(ListNode head) {//递归结束条件和链表为空的条件判断if(head == null || head.next == null){return head;}//递归调用,当递归到最后一个节点时返回,也就是反转后的头节点,我们用变量记录下来ListNode newHead = reverseList(head.next);//从倒数第二个节点开始,将后一个节点的指针指向自己head.next.next = head;//将自己的next指针指向null,避免死循环head.next = null;//返回头节点return newHead;
}

方法四:双指针

双指针法:定义两个指针,都先指向头节点。将旧链表指针的下一个节点断开,插入到链表的头节点处,更新新链表的指针

    public ListNode reverseList(ListNode head) {//判断链表为空的情况if(head == null){return head;}//定义新链表指针ListNode n1 = head;//定义旧链表指针ListNode o1 = head;//判断条件,旧链表指针的下一个节点不为nullwhile(o1.next != null){//记录旧链表的下一个指针ListNode temp = o1.next;//跳过旧链表指针的下一个节点o1.next = o1.next.next;//将跳过的指针指向头temp.next = n1;//更新新链表的指针n1 = temp;}return n1;}

方法五:遍历

遍历法,定义三个指针,从前向后遍历一遍并更改指针的指向

    public ListNode reverseList(ListNode head) {//前指针ListNode prev = null;//当前指针ListNode p = head;//后一个指针ListNode next = null;while(p != null){//后一个指针,为什么要在循环里面赋值呢?避免head为null的情况next = p.next;//将当前指针指向前一个p.next = prev;//更新前指针prev = p;//更新当前指针p = next;}//这里为什么要返回前指针,因为p在循环里面被更新为null,循环才不能进行,所以循环走完后prev的位置是头节点的位置return prev;}

总结

本文讲解了反转指针的五种方法,反转指针是链表操作中的基础,但是特别重要,大家快去练习把~

http://www.lryc.cn/news/254481.html

相关文章:

  • 使用Java网络编程,窗口,线程,IO,内部类等实现多人在线聊天1.0
  • 相关教程test
  • mysql知识分享(包含安装卸载)(一)
  • Google Guava 反射工具使用详解
  • MySql MVCC 详解
  • 工业机器视觉megauging(向光有光)使用说明书(三,轻量级的visionpro)
  • Linux 环境下,jdbc连接mysql问题
  • Python读写txt文件数据
  • Linux虚假唤醒
  • 倒计时模块复习
  • k8s(三): 基本概念-ReplicaSet与Deployment
  • Linux 的介绍和云服务器上web 程序部署
  • Oauth2.0 学习
  • Elasticsearch:什么是向量数据库?
  • rename--统一的PRF
  • 010-editor破解(1)
  • Ubuntur编译ROS报错:error PCL requires C++14 or above
  • 17.认识下Docker之docker的核心原理(2)
  • 【EasyExcel实践】万能导出,一个接口导出多张表以及任意字段(可指定字段顺序)
  • 代码随想录算法训练营第四十二天 _ 动态规划_01背包问题、416.分割等和子集。
  • 市场上好用的aspera替代方案,你知道哪些
  • Stm32_串口的帧(不定长)数据接收
  • L0、Linux常用命令
  • Golang实践录:读取toml配置
  • 超大规模集成电路设计----基于阵列的可编程逻辑(七)
  • 深入探索FastAPI单元测试:使用TestClient轻松测试你的API
  • 基于ssm小型企业办公自动化系统论文
  • CasADi - 最优控制开源 Python/MATLAB 库
  • Java中使用String字符串的注意事项
  • 离线数仓构建案例一