当前位置: 首页 > 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大 那就放进largetaillargeTail.next = cur;largeTail = cur;}else{//如果比x小 那就放进smalltailsmallTail.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){//每次循环开始前都要创建一个nextListNode 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 hereif (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://www.mrgr.cn/news/98324.html

相关文章:

  • 14、nRF52xx蓝牙学习(串口 UART 和 UARTE 外设应用)
  • 【数据结构_4】顺序表
  • linux多线(进)程编程——(6)共享内存
  • 【前端工程化】-【vue2-ele项目升级】
  • 深度学习ResNet模型提取影响特征
  • 【数据结构_6下篇】有关链表的oj题
  • C语言打印的坑
  • 【玩转全栈】—— Django 连接 vue3 保姆级教程,前后端分离式项目2025年4月最新!!!
  • 个人博客系统后端 - 注册登录功能实现指南
  • 行星际激波在日球层中的传播:Propagation of Interplanetary Shocks in the Heliosphere (第二部分)
  • linux多线(进)程编程——(5)虚拟内存与内存映射
  • 【Java学习笔记】Java第一课,梦开始的地方!!!
  • centos7系统搭建nagios监控
  • SQL 解析 with as dual sysdate level
  • 剑指Offer(数据结构与算法面试题精讲)C++版——day9
  • Day30笔记-综合项目: 购物车
  • CMD命令行笔记
  • Pytorch深度学习框架60天进阶学习计划 - 第41天:生成对抗网络进阶(三)
  • 【随手笔记】QT避坑一(串口readyRead信号不产生)
  • 【3GPP核心网】【5G】精讲5G系统的策略和计费控制框架