当前位置:   article > 正文

备战蓝桥杯————如何判断回文链表

备战蓝桥杯————如何判断回文链表

如何判断回文链表

题目描述

        给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。

示例 1:

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

示例 2:

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

提示:

  • 链表中节点数目在范围[1, 105] 内
  • 0 <= Node.val <= 9

解题思路及代码

  •         使用快慢指针法找到链表的中间节点,快指针每次走两步,慢指针每次走一步,当快指针到达链表尾部时,慢指针恰好到达中间节点。
  •         根据是否有偶数个节点,将慢指针指向下一个节点,以确保慢指针指向后半部分链表的起始节点。
  •         将后半部分链表反转。
  •         逐一比较前半部分链表和反转后的后半部分链表的节点值,如果全部相同,则链表是回文的,否则不是。
  1. /**
  2. * Definition for singly-linked list.
  3. * public class ListNode {
  4. * int val;
  5. * ListNode next;
  6. * ListNode() {}
  7. * ListNode(int val) { this.val = val; }
  8. * ListNode(int val, ListNode next) { this.val = val; this.next = next; }
  9. * }
  10. */
  11. class Solution {
  12. boolean isPalindrome(ListNode head) {
  13. ListNode slow, fast;
  14. slow = fast = head;
  15. while (fast != null && fast.next != null) {
  16. slow = slow.next;
  17. fast = fast.next.next;
  18. }
  19. if (fast != null)
  20. slow = slow.next;
  21. ListNode left = head;
  22. ListNode right = revese(slow);
  23. while (right != null) {
  24. if (left.val != right.val)
  25. return false;
  26. left = left.next;
  27. right = right.next;
  28. }
  29. return true;
  30. }
  31. public ListNode revese(ListNode head){
  32. ListNode pre=null,cur=head,next=head;
  33. while(cur!=null){
  34. next=cur.next;
  35. cur.next=pre;
  36. pre=cur;
  37. cur=next;
  38. }
  39. return pre;
  40. }
  41. }

结果展示

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

闽ICP备14008679号