当前位置:   article > 正文

牛客网刷题——链表_牛客网考试 需要定义链表吗

牛客网考试 需要定义链表吗

ced485cbb11e458d81a746890b32cf3f.gif

 作者:敲代码の流川枫

博客主页:流川枫的博客

专栏:和我一起学java

语录:Stay hungry stay foolish

给大家推荐一款好用的神器
Apifox = Postman + Swagger + Mock + JMeter。集接口文档工具、接口Mock工具、接口自动化测试工具、接口调试工具于一体,提升 10 倍研发效率戳我来体验~

文章目录

在线Oj链接

1. 题目描述

2. 解题思路

 3. 题解


在线Oj链接

OR36 链表的回文结构

1. 题目描述

对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。

给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。

测试样例:

2. 解题思路

先用快慢指针找到链表的中间节点

再将中间节点后部分的链表反转

然后从链表两头开始比较元素的大小

对上面这个链表,我们先定义一个快慢指针,fast和slow,让fast走两步,slow走一步,当fast=null或者fast.next=null时,说明slow为中间节点,如下图;

 找到中间节点后,我们进行中间节点后的链表反转

定义一个cur记录待反转链表头节点,curNext记录cur,反转后结果如下:

 此时只需要从两端开始比较对应位置值的大小就可以了

 3. 题解

  1. import java.util.*;
  2. public class ListNode {
  3. int val;
  4. ListNode next = null;
  5. ListNode(int val) {
  6. this.val = val;
  7. }
  8. }
  9. public class PalindromeList {
  10. public boolean chkPalindrome(ListNode head) {
  11. // write code here
  12. if(head == null){
  13. return false;
  14. }
  15. if(head.next == null){
  16. return true;
  17. }
  18. //找中间点
  19. ListNode fast = head;
  20. ListNode slow = head;
  21. while(fast!=null&&fast.next!=null){
  22. fast = fast.next.next;
  23. slow = slow.next;
  24. }
  25. //2.反转
  26. ListNode cur = slow.next;
  27. while(cur!=null){
  28. ListNode curNext = cur.next;
  29. cur.next = slow;
  30. slow = cur;
  31. cur = curNext;
  32. }
  33. //3.比较大小
  34. while(head!=slow){
  35. if(head.val!=slow.val){
  36. return false;
  37. }
  38. //链表长度为偶数情况
  39. if(head.next == slow){
  40. return true;
  41. }
  42. head = head.next;
  43. slow = slow.next;
  44. }
  45. return true;
  46. }
  47. }

在比较大小的时候要注意是偶数的情况,用head.next == slow来解决

“ 本期的分享就到这里了, 记得给博主一个三连哈,你的支持是我创作的最大动力!

ced485cbb11e458d81a746890b32cf3f.gif

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/528575
推荐阅读
相关标签
  

闽ICP备14008679号