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

【数据结构_6上篇】有关链表的oj题

import java.util.*;

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Partition {
    public ListNode partition(ListNode pHead, int x) {
        // write code here
        //1.首先要判断链表是否为空的情况
        if(pHead == null){
            return pHead;
        }
        //2.来解决一般情况
        //创建两个新的链表 一个用来记录比x值大的元素 一个用来记录比x值小的元素
        //因为后期涉及到尾插操作,我们再分别为这两个新的链表设置一个尾巴
        //为了使后期的插入操作变得简单,我们为两个链表都创建傀儡节点
        ListNode largeNode =  new ListNode(0);
        ListNode largeTail = largeNode;

        ListNode smallNode = new ListNode(0);
        ListNode smallTail = smallNode;


        //接下来我们进行链表的遍历操作
        ListNode cur = pHead;
        for(;cur != null; cur = cur.next){
            if(cur.val >= x ){
                //如果比x大 那就放进largetail
                largeTail.next = cur;
                largeTail = cur;
            }else{
                   //如果比x小 那就放进smalltail
                smallTail.next = cur;
                smallTail = cur;
            }
        }
        //此时两个链表都书写完毕 接下来就要将他们两个进行相连


        smallTail.next = largeNode.next;
        largeTail.next = null;
        return smallNode.next;
        
    }
}

空间复杂度为O(N)的解法

import java.util.*;

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class PalindromeList {
    public boolean chkPalindrome(ListNode A) {
        // write code here
        //0.首先考虑特殊情况
        //0.1 如果链表为空 那么直接返回
        if(A == null){
            return true;
        }
        //0.2 如果链表中只有一个元素 那么也直接返回
        if(A.next == null){
            return true;
        }
        //1.首先我们先复制一个与A一摸一样的链表
        ListNode newHead = new ListNode(0);
        ListNode newTail = newHead;
        ListNode cur1 = A;
        for(;cur1!=null;cur1 = cur1.next){
            //*不是直接将A中的节点赋值,而是要另外复制一份
            ListNode node = new ListNode(cur1.val);
            newTail.next = node;
            newTail = node;
        }
        //不再使用傀儡节点
        newHead = newHead.next;

        //2.完成了复制之后 我们要将新的链表进行逆置
        ListNode prev = null;
        ListNode cur = newHead;
        while(cur!= null){
            //每次循环开始前都要创建一个next
            ListNode next = cur.next;
            if(next == null){
                //说明结束了,此时的cur为新的头节点
                newHead = cur;
            }
            cur.next = prev;
            prev = cur;
            cur = next;
    
        }

        //3.对A与逆置的链表进行比较
        ListNode cur3 = A;
        ListNode cur4 = newHead;
        while(cur3 != null && cur4 != null){
            if(cur3.val != cur4.val){
                return false;
            }
            cur3 = cur3.next;
            cur4 = cur4.next;
        }

        //4.出来后还要比较二者的长度
        if(cur3 == null && cur4 == null){
            return true;
        }
        return false;

    }
}

空间复杂度为O(1)的写法

import java.util.*;

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class PalindromeList {
    public boolean chkPalindrome(ListNode A) {
        // write code here

        if (A == null) {
            return true;
        }
        if (A.next == null) {
            return true;
        }
        // 1. 找到链表中间节点.
        int size = size(A);
        int step = size / 2;
        ListNode B = A;
        for (int i = 0; i < step; i++) {
            B = B.next;
        }
        // 此时 B 指向的就是中间节点了.

        // 2. 针对 B 这个链表进行逆置.
        ListNode prev = null;
        ListNode cur = B;
        while (cur != null) {
            ListNode next = cur.next;
            if (next == null) {
                // cur 就是新的头节点.
                B = cur;
            }
            cur.next = prev;
            prev = cur;
            cur = next;
        }

        // 3. 比较 A 和 B 两个链表是否相同.
        ListNode cur1 = A;
        ListNode cur2 = B;
        while (cur1 != null && cur2 != null) {
            if (cur1.val != cur2.val) {
                return false;
            }
            cur1 = cur1.next;
            cur2 = cur2.next;
        }
        // 不去考虑长度问题了. 如果节点是偶数个, 此时 A 的长度就是会比 B 多一个.
        return true;
    }
      public int size(ListNode head) {
        int size = 0;
        for (ListNode cur = head; cur != null; cur = cur.next) {
            size++;
        }
        return size;
    }
}

文章转载自:
http://anthroposcopy.sxnf.com.cn
http://arises.sxnf.com.cn
http://bumble.sxnf.com.cn
http://antlion.sxnf.com.cn
http://bumtang.sxnf.com.cn
http://aphetic.sxnf.com.cn
http://calcaneal.sxnf.com.cn
http://chayote.sxnf.com.cn
http://berkeley.sxnf.com.cn
http://backwardation.sxnf.com.cn
http://avouchment.sxnf.com.cn
http://backmost.sxnf.com.cn
http://bosquet.sxnf.com.cn
http://angell.sxnf.com.cn
http://accomodate.sxnf.com.cn
http://autography.sxnf.com.cn
http://arrenotokous.sxnf.com.cn
http://anthropophagite.sxnf.com.cn
http://acajou.sxnf.com.cn
http://ajog.sxnf.com.cn
http://buyable.sxnf.com.cn
http://chaussee.sxnf.com.cn
http://beamish.sxnf.com.cn
http://amulet.sxnf.com.cn
http://arith.sxnf.com.cn
http://boots.sxnf.com.cn
http://brooky.sxnf.com.cn
http://beseechingly.sxnf.com.cn
http://charka.sxnf.com.cn
http://castalie.sxnf.com.cn
http://www.dtcms.com/a/131457.html

相关文章:

  • 【含文档+PPT+源码】蛋糕商城预定App的设计与实现
  • HTML5新特性
  • 在springboot项目中调用第三方天气api服务
  • js中 剩余运算符(Rest Operator )(...)和展开运算符(Spread Operator)(...)的区别及用法
  • 基于open3d的一些常见点云操作
  • 【数据结构_4】顺序表
  • Adobe After Effects的插件--------Optical Flares之面板属性
  • KWDB创作者计划—KWDB场景创新:多模态数据融合与边缘智能的产业实践
  • 中厂算法岗面试总结
  • 【SLAM】在ORB_SLAM2的ROS模式下使用RealSense D435相机
  • R语言——直方图
  • (自用)若依生成左树右表
  • 【WORD】批量将doc转为docx
  • 搬运机器人的基本工作场景及原理
  • 202526 | 消息队列MQ
  • Pytorch深度学习框架60天进阶学习计划 - 第41天:生成对抗网络进阶(三)
  • 51c自动驾驶~合集17
  • jetpack之jetpack的概括和其中组件的简单使用
  • STM32 HAL库 HC - SR04 超声波测距模块驱动实现
  • IoT安全透视:D-Link DWR-932B固件全面逆向漏洞挖掘全面解析
  • 使用Python计算汉密尔顿路径
  • Python实现贪吃蛇二
  • Pandas 中透视表(`pivot_table`)和交叉表(`crosstab`)的区别
  • DeepSeek BLEU和ROUGE(Recall)的计算
  • torch.cat和torch.stack的区别
  • 应急响应靶机-Linux(1)
  • 数据结构*包装类泛型
  • C语言进阶之指针
  • CMD命令行笔记
  • 数据库实验:分组查询与聚集函数的使用