08、判断一个链表是否为回文链表(JAVA)--链表

137 阅读2分钟

题目描述:

image.png 题目链接:leetcode.cn/problems/aM…


思路解析:

方法一:使用其他API(例如栈)

运用,将每个节点全部存到栈当中,然后从栈中每弹出一个节点,就与原链表的节点进行比较,当栈为空时,说明该链表为回文链表,返回true;如果栈中的节点值与原链表中的节点值不同,则说明该链表不是回文链表,返回false。

方法二:链表反转

  1. 找到链表的中点
  2. 将链表的后半部分反转
  3. 同时遍历两条链表,将前半部分和反转后的部分中的每个节点依次比较
  4. 如果两条链表都遍历到了最后一个节点的next,则说明原链表为回文链表,返回true
  5. 若遍历的过程中有节点的值不同,则说明该链表不是回文链表,返回false

节点数为奇数时: image.png

节点数为偶数时: image.png


伪代码:

方法一:使用其他API(例如栈)

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */

import java.util.Stack;

//使用其他API(例如栈)
class Solution {
    public boolean isPalindrome(ListNode head) {
      if(head.next==null){
        return true;
      }

      ListNode cur=head;
      Stack<ListNode> Nodes=new Stack<>();

      //第一遍遍历--将原链表的每个节点压入栈中
      while(cur!=null){
        Nodes.push(cur);
        cur=cur.next;
      }

      //第二遍遍历--将栈中的每个节点与原链表进行比较
      cur=head;
      while(!Nodes.isEmpty()){
        int val=Nodes.pop().val;
        if(cur.val!=val){
          return false;
        }
        cur=cur.next;
      }

      return true;
    }
}

测试结果:

image.png


方法二:链表反转

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */

 //不使用额外空间
class Solution {
    public boolean isPalindrome(ListNode head) {
      if(head.next==null){
        return true;
      }

      ListNode fast=head;//快指针
      ListNode slow=head;//慢指针
      ListNode meet=null;//中间节点

      //第一遍遍历--找链表的中点
      while(fast!=null&&fast.next!=null){
        fast=fast.next.next;
        meet=slow;
        slow=slow.next;
      }
      meet.next=null;

      ListNode newHead=slow;
      ListNode pre=null;//记录newHead的前一个结点
      //第二遍遍历--将后半段链表反转
      while(newHead!=null){
        ListNode next=newHead.next;
        newHead.next=pre;
        pre=newHead;
        newHead=next;
      }

      //第三遍遍历--判断左右两段链表的每个节点值是否相等
      while(head!=null&&pre!=null){
        if(head.val!=pre.val){
          return false;
        }
        head=head.next;
        pre=pre.next;
      }

      return true;
    }
}

测试结果:

image.png


这道题的介绍到这里就结束了,如果你觉得本篇文章对你多少有些帮助,可以点个赞或者收藏一波支持支持,欢迎各位大佬批评指正,咱们下次再见!