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

LeetCode (206单链表反转)

目录

题目描述:

代码:

第一种:

第二种:

第三种:

第四种:

第五种:

主函数:

ListNode类:


题目描述:

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

示例 1:

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

示例 2:

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

示例 3:

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

代码:

第一种:

构造一个新链表,从旧链表依次拿到每一个节点,创建新节点添加到新链表的头部,最后返回新链表的头节点
  public ListNode reverseList1(ListNode o1) {
        ListNode n1 = null;
        ListNode p = o1;
        while (p != null) {
            n1 = new ListNode(p.val, n1);
            p = p.next;
        }
        return n1;
    }

第二种:

构造一个新的链表,从旧链表的头部移除节点,添加到新链表的头部,与上一个方法的区别在于未提供节点外层的容器类,
public ListNode reverseList2(ListNode head) {
        List list1=new List(head);
        List list2=new List(null);
        while(true){
            ListNode first=list1.removeFirst();
            if(first==null)
                break;
            list2.addFirst(first);
        }
        return list2.head;
    }
    public class List{
        ListNode head;
        public List(ListNode head){
            this.head=head;
        }
        public void addFirst(ListNode first){
            first.next=head;
            head=first;
        }
        public ListNode removeFirst(){
            ListNode first=head;
            if(first!=null){
                head=first.next;
            }
            return first;
        }
    }

第三种:

递归

 public ListNode reverseList3(ListNode p) {
        if(p==null||p.next==null)
            return p;
        ListNode last=reverseList3(p.next);//p.next为5
        p.next.next=p;//假设p为4,p.next为5,那么p.next.next=p就是5.next=4
        p.next=null;//4.next=null
        return last;
    }

第四种:

从链表每次拿到第二个节点,将其从链表断开,插入头部,直到它为null结束
 public ListNode reverseList4(ListNode o1) {
        //1.空链表,2.一个元素
        if(o1==null||o1.next==null)
            return o1;
        ListNode o2=o1.next;
        ListNode n1=o1;
        while(o2!=null){
            o1.next=o2.next;//将其断开
            o2.next=n1;//插入头部
            n1=o2;//n1指向头部
            o2=o1.next;//o2指向下一个节点
        }
        return n1;
    }

第五种:

将链表分成两个部分,不断从链表2的头部往下插入链表1的头部,直到链表2为空结束
public ListNode reverseList(ListNode o1) {
        //1.空链表,2.一个元素
        if(o1==null||o1.next==null)
            return o1;
        ListNode n1=null;
        while(o1!=null){
            ListNode o2=o1.next;
            o1.next=n1;
            n1=o1;
            o1=o2;
        }
        return n1;
    }

主函数:

 public static void main(String[] args) {
        ListNode o5=new ListNode(5,null);
        ListNode o4=new ListNode(4,o5);
        ListNode o3=new ListNode(3,o4);
        ListNode o2=new ListNode(2,o3);
        ListNode o1=new ListNode(1,o2);
        System.out.println(o1);
        ListNode n1=new Test().reverseList(o1);
        System.out.println(n1);
    }

ListNode类:

package reverseList;

public class ListNode {
    //反转单向链表
    public int val;
    public ListNode next;
    public ListNode(int val, ListNode next){
        this.val = val;
        this.next = next;
    }

    public String toString(){
        StringBuilder sb=new StringBuilder();//创建一个 StringBuilder 对象,用于构建字符串。
        sb.append("[");
        ListNode p=this;//创建一个指向当前节点的指针,用于遍历链表
        while(p!=null){
            sb.append(p.val);
            if(p.next!=null){
                sb.append(",");
            }
            p=p.next;
        }
        sb.append("]");
        return sb.toString();//将 StringBuilder 对象转换为字符串,并返回该字符串。
    }
    public ListNode reverseList(ListNode o1) {
        ListNode n1 = null;
        ListNode p = o1;
        while (p != null) {
            n1 = new ListNode(p.val, n1);
            p = p.next;
        }
        return n1;
    }
}


http://www.kler.cn/a/377488.html

相关文章:

  • qt QStandardItem详解
  • CMake set cache用法
  • NXP Zigbee JN5169 开发环境软件 文档和支持资源打包下载
  • 【北京迅为】《STM32MP157开发板嵌入式开发指南》-第七十二章 Debian文件系统
  • PySpark 本地开发环境搭建与实践
  • Dify 中的 @login_required 装饰器
  • React + Vite + TypeScript + React router项目搭建教程
  • 以客户为导向在开源 AI 智能名片 2 + 1 链动模式 S2B2C 商城小程序内容创作中的实践与价值
  • 【缓存与加速技术实践】NoSQL之Redis部署安装与基础命令
  • 【LwIP源码学习4】主线程tcpip_thread
  • 1011:甲流疫情死亡率
  • 【零售和消费品&存货】价格标签检测系统源码&数据集全套:改进yolo11-RFAConv
  • 地平线 3D 目标检测 bev_sparse 参考算法-V1.0
  • TOEIC 词汇专题:饭店住宿篇
  • Docker篇(基础命令)
  • 【ChatGPT】让ChatGPT在回答中附带参考文献与来源
  • 淘宝 API 多语言接入:释放技术开发新潜力
  • 【react】基础知识点学习
  • String、StringBuffer、StringBuilder
  • Java如何通过Apache POI提升Excel文档数据的导出速度?
  • Qt c++ (一)创建一个APP
  • Python程序设计 生成器
  • Linux内核与驱动开发学习
  • C# 中使用Topshelf 注意事项
  • 设计模式(六)
  • Docker小记