题目描述:
思路解析:
方法一:使用其他API(例如栈)
运用
栈,将每个节点全部存到栈当中,然后从栈中每弹出一个节点,就与原链表的节点进行比较,当栈为空时,说明该链表为回文链表,返回true;如果栈中的节点值与原链表中的节点值不同,则说明该链表不是回文链表,返回false。
方法二:链表反转
- 找到链表的
中点;将链表的后半部分反转;同时遍历两条链表,将前半部分和反转后的部分中的每个节点依次比较;- 如果两条链表都遍历到了最后一个节点的next,则说明原链表为回文链表,
返回true;- 若遍历的过程中有节点的值不同,则说明该链表不是回文链表,
返回false。
节点数为奇数时:
节点数为偶数时:
伪代码:
方法一:使用其他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;
}
}
测试结果:
方法二:链表反转
/**
* 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;
}
}
测试结果:
这道题的介绍到这里就结束了,如果你觉得本篇文章对你多少有些帮助,可以点个赞或者收藏一波支持支持,欢迎各位大佬批评指正,咱们下次再见!