0


【蓝桥Java每日一练】——9.回文链表

⭐️引言⭐️

  1. 大家好啊,我是执梗。今天带来一道能检验链表基础的题,题目比较简单,但是想通过确实容易,但想使用更好复杂度的方法却不容易。非常推荐大家一起来尝试一下,将回文与链表相结合的基础题。

⭐️精彩回放⭐️
2022.1.16——Java每日一练【蓝桥Java每日一练】——8.计算力扣银行的钱2022.1.14——Java每日一练【蓝桥Java每日一练】——7.至少是其他数字两倍的最大数2022.1.11——Java每日一练【蓝桥Java每日一练】————6.二叉树的前中后序遍历(递归与迭代)2022.1.9——Java每日一练【蓝桥Java每日一练】————5.按键持续时间最长的键2022.1.8——Java每日一练【蓝桥Java每日一练】————4.移除元素

🍋1.回文链表

给你一个单链表的头节点

  1. head

,请你判断该链表是否为回文链表。如果是,返回

  1. true

;否则,返回

  1. false

题目链接:【蓝桥Java每日一练】————5.按键持续时间最长的键

🍋朴素做法

  1. 朴素的做法当然是转换成判断普通回文的题目,由于链表的长度在一开始是未知的,所以我们需要用集合去遍历存储链表的所有元素,然后写一个双指针判断回文的方法判断该链表是否是回文链表。
  2. 时间复杂度O(N):N为链表的长度,一次循环遍历链表,一次循环判断回文,所以总体时间复杂度为O(N)
  3. 空间复杂度O(N):N为链表的长度,主要是存储链表元素集合的开销。
  1. classSolution {
  2. publicbooleanisPalindrome(ListNode head) {
  3. //用来保存链表的值
  4. List<Integer> list=newArrayList<>();
  5. int cur=0;
  6. ListNode node=head;
  7. while(node!=null){
  8. list.add(node.val);
  9. node=node.next;
  10. }
  11. return test(list);
  12. }
  13. //判断是否是回文的方法,参数注意为Listpublicbooleantest(List<Integer> list){
  14. int left=0;
  15. int right=list.size()-1;
  16. while(left<right){
  17. if(list.get(left++)!=list.get(right--)){
  18. returnfalse;
  19. }
  20. }
  21. returntrue;
  22. }
  23. }

🍋进阶做法

  1. 在题目中的进阶要求是需要我们在时间复杂度O(n)且空间复杂度O(1)下完成,这就使得我们不可以通过遍历链表保存元素的方式去完成,必须得在原链表上进行判断。在这我们把链表的后半部分反转,然后去判断前半部分和后半部分是否相等,然后对于被我们反转过的链表是否需要反转回来都是可行的,但毕竟使用者不希望自己的链表被修改,所以建议还是修改回来。
  2. 时间复杂度On):其中 n 指的是链表的大小
  3. 空间复杂度O1)

整个流程可以分为以下五个步骤

  1. 找到前半部分链表的尾节点。
  2. 反转后半部分链表。
  3. 判断是否回文。
  4. 恢复链表(有或无都可以)。
  5. 返回结果。
  1. class Solution {
  2. public boolean isPalindrome(ListNode head) {
  3. if(head == null || head.next == null) return true;
  4. // 找中点 1=>1 123=>2 1234=>2
  5. ListNode A_end = mid(head);
  6. ListNode B_start = A_end.next;
  7. A_end.next = null;
  8. // 翻转后半部分
  9. B_start = reverse(B_start);
  10. // 比对
  11. boolean res = compare(head, B_start);
  12. // 还原
  13. A_end.next = reverse(B_start);
  14. return res;
  15. }
  16. // 链表找中点,快慢指针法
  17. ListNode mid(ListNode head) {
  18. ListNode p = head;
  19. ListNode q = head;
  20. while(q.next != null && q.next.next != null) {
  21. p = p.next;
  22. q = q.next.next;
  23. }
  24. return p;
  25. }
  26. // 链表反转模板
  27. ListNode reverse(ListNode head) {
  28. ListNode pre = null;
  29. ListNode cur = head;
  30. while(cur != null) {
  31. ListNode temp = cur.next;
  32. cur.next = pre;
  33. pre = cur; // 归位
  34. cur = temp;
  35. }
  36. return pre;
  37. }
  38. // 链表比对模板(len(B) <= len(A))
  39. boolean compare(ListNode A, ListNode B) {
  40. while(B != null) {
  41. if(A.val != B.val) return false;
  42. A = A.next;
  43. B = B.next;
  44. }
  45. return true;
  46. }
  47. }
  1. **我是执梗,期待和你一起进步的过程!**
标签: java 链表 蓝桥杯

本文转载自: https://blog.csdn.net/m0_57487901/article/details/122551486
版权归原作者 执 梗 所有, 如有侵权,请联系我们删除。

“【蓝桥Java每日一练】&mdash;&mdash;9.回文链表”的评论:

还没有评论