给定一个链表,请判断该链表是否为回文结构。
回文是指该字符串正序逆序完全一致。
数据范围: 链表节点数
,链表中每个节点的值满足
class Solution {
public:
bool isPail(ListNode* head) {
int a[1000005];
ListNode* now = head;
int len = 0;
while(now != nullptr) {
a[len++] = now->val;
now = now->next;
}
for (int i=0, j=len-1; i<=j; i++, j--) {
if (a[i] != a[j]) return false;
}
return true;
}
}; import java.util.*;
public class Solution {
/**
*
* @param head ListNode类 the head
* @return bool布尔型
*/
public boolean isPail (ListNode head) {
ListNode slow = head;
ListNode fast = head;
while(fast != null && fast.next != null){
fast = fast.next.next;
slow = slow.next;
}
Stack<Integer> stack = new Stack<>();
while(slow != null){
stack.add(slow.val);
slow = slow.next;
}
while(!stack.isEmpty()){
if(stack.pop() != head.val){
return false;
}
head = head.next;
}
return true;
}
} import java.util.*;
public class Solution {
public boolean isPail (ListNode head) {
ListNode slow = head, fast = head;
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
}
ListNode reverseList = reverse(slow);
ListNode cur1 = reverseList, cur2 = head;
while (cur1 != null) {
if (cur1.val != cur2.val) {
return false;
}
cur1 = cur1.next;
cur2 = cur2.next;
}
return true;
}
public ListNode reverse(ListNode head) {
ListNode cur = head, pre = null;
while (cur != null) {
ListNode tmp = cur.next;
cur.next = pre;
pre = cur;
cur = tmp;
}
return pre;
}
} class Solution: def isPail(self , head: ListNode) -> bool: if not head&nbs***bsp;not head.next: return True # write code here # 1.找到中点 fast, slow = head, head slow_pre = head while fast and fast.next: fast = fast.next.next slow_pre = slow slow = slow.next # 2.slow 会在中间靠右的地方 # [1, 2, 2, 1] => slow 右边的 2 # [1, 2, 3, 2, 1] => slow 在正中间 # 断开链表 slow_pre.next = None # 2.翻转链表 def reverse(node): prev = None while node: tmp = node.next node.next = prev prev = node node = tmp return prev slow = reverse(slow) # 因为 head 会少一些 while head: if slow.val != head.val: return False slow = slow.next head = head.next return True
bool isPail(struct ListNode* head ) {
// write code here
int size=0;
struct ListNode* p=head;
while(p){
size++;
p=p->next;
}
int *arr=malloc(sizeof(int)*size);
p=head;
int i=0,j=size-1;
while(p){
arr[i]=p->val;
p=p->next;
i++;
}
i=0;
while(i<j){
if(arr[i]==arr[j]){
i++;
j--;
}
else{
return false;
}
}
return true;
} import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* public ListNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类 the head
* @return bool布尔型
*/
public boolean isPail (ListNode head) {
// 处理空链表(视为回文)
if (head == null) {
return true;
}
// 步骤1:将链表节点的值存入数组
List<Integer> values = new ArrayList<>();
ListNode current = head;
while (current != null) {
values.add(current.val);
current = current.next;
}
// 步骤2:使用双指针判断数组是否为回文
int left = 0;
int right = values.size() - 1;
while (left < right) {
// 若对应位置的值不相等,则不是回文
if (!values.get(left).equals(values.get(right))) {
return false;
}
left++; // 左指针右移
right--; // 右指针左移
}
// 所有对应位置的值都相等,是回文
return true;
}
}
# class ListNode: # def __init__(self, x): # self.val = x # self.next = None # # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # # @param head ListNode类 the head # @return bool布尔型 # class Solution: def isPail(self , head: ListNode) -> bool: # write code here if not head: return head pre = head nums = [] while pre is not None: val = pre.val pre = pre.next nums.append(val) if nums == nums[::-1]: return True return False
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* }
*/
public class Solution {
/**
*
* @param head ListNode类 the head
* @return bool布尔型
*/
public boolean isPail (ListNode head) {
//取得链表的长度,再从中间断开,判断是不是一样的
// write code here
ArrayList<Integer> list=new ArrayList<Integer>();
ListNode cur=head;
while(cur!=null){//遍历整个链表到list,就是为了获得整个链表的长度
list.add(cur.val);
cur=cur.next;
}
boolean ans=true;
for(int i=0;i<(list.size()-1)/2;i++){
if(list.get(i)!=(int)list.get(list.size()-1-i)){//注意这里强转为int
ans=false;
break;
}
}
return ans;
}
} public class Solution {
/**
*
* @param head ListNode类 the head
* @return bool布尔型
*/
public boolean isPail (ListNode head) {
// write code here
if(head == null){
return false;
}
// 1: 利用回文链表正反遍历相同的特性将链表节点放入栈中
Stack<ListNode> stack = new Stack<>();
ListNode cur = head;
while(cur != null){
stack.add(cur);
cur = cur.next;
}
// 2: 从链表的头节点和栈的顶开始遍历,若每个值都相等说明是回文
cur = head;
while(cur != null){
if(cur.val != stack.pop().val){
return false;
}
cur = cur.next;
}
return true;
}
} import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* }
*/
public class Solution {
/**
*
* @param head ListNode类 the head
* @return bool布尔型
*/
public boolean isPail (ListNode head) {
// write code here
ArrayList<ListNode> a = new ArrayList<>();
while (head != null) {
a.add(head);
head = head.next;
}
for (int i = 0, j = a.size() - 1; i < a.size() / 2; i++, j--)
if (a.get(i).val != a.get(j).val)
return false;
return true;
}
} //快慢指针找中间节点加上慢指针头插法
public boolean isPail (ListNode head) {
if (head == null || head.next == null) return true;
ListNode fast = head;
ListNode slow = head; //慢指针找中间节点
ListNode pre = null; //头插法指针
while(fast != null && fast.next != null){ //不能用|| 当fast=null fast.next会越界
ListNode temp = slow.next;
fast = fast.next.next;
slow.next = pre;
pre = slow;
slow = temp;
}
if (fast != null) slow = slow.next; //奇数个节点,就跳到下一个
while(slow != null && pre != null){
if (pre.val != slow.val) return false;
slow = slow.next;
pre = pre.next;
}
return true;
} /**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*
* C语言声明定义全局变量请加上static,防止重复定义
*
* C语言声明定义全局变量请加上static,防止重复定义
*/
/**
*
* @param head ListNode类 the head
* @return bool布尔型
*/
#include <stdbool.h>
typedef struct ListNode Node;
bool isPail(struct ListNode* head ) {
// write code here
if(head == NULL || head ->next == NULL){
return true;
}
Node *p1 = head;
Node *p2 = head;
//首先找到中点,当p2->next->next为 NULL,那么此时p1刚好在中点
while(p2 != NULL && p2->next != NULL){
p2 = p2->next->next;
p1 = p1->next;
}
//快指针到尾判断,如果p2不为空,说明链表的长度是奇数个
if(p2 != NULL) {
p1 = p1->next;
}
Node *p = p1;
Node *pre = NULL;
while(p != NULL){
Node *q = p->next;
p->next = pre;
pre = p;
p = q;
}
while(pre != NULL){
if(pre->val != head->val){
return false;
}
pre = pre->next;
head = head->next;
}
return true;
} import java.util.*;
public class Solution {
public boolean isPail (ListNode head) {
// 空链表或者链表只有一个节点,是回文链表
if(head == null || head.next == null)
return true;
// 使用快慢指针,找到中间的节点
ListNode slow = head, fast = head.next;
while(fast.next != null && fast.next.next != null){
fast = fast.next.next;
slow = slow.next;
}
// 需要注意的是,如果是奇数个节点的情况,慢指针slow的next是中间节点
// 这个中间节点无论是多少,不影响回文判断,因此需要再次向后移动一个位置
ListNode secondSegHead = slow.next;
if(fast.next != null)
secondSegHead = secondSegHead.next;
// 反转链表的后半段,然后比较前半段和后半段的节点数值
// 如果出现不一致的情况,说明不是回文链表;反之则是回文链表
secondSegHead = reverse(secondSegHead);
while(secondSegHead != null){
if(head.val != secondSegHead.val)
return false;
head = head.next;
secondSegHead = secondSegHead.next;
}
return true;
}
// 反转链表
private ListNode reverse(ListNode secondSegHead){
ListNode pre = null, cur = secondSegHead, next = null;
while(cur != null){
next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
return pre;
}
} 方法二:复制原链表,然后直接反转比较: import java.util.*;
public class Solution {
public boolean isPail (ListNode head) {
// 如果为空链表,或者只有一个节点,是回文链表
if(head == null || head.next == null)
return true;
// 如果链表多于两个结点,那么复制这张链表
ListNode tmp_head = head;
ListNode dummy_node = new ListNode(0);
ListNode cur = dummy_node;
while(tmp_head != null){
ListNode node = new ListNode(tmp_head.val);
cur.next = node;
cur = node;
tmp_head = tmp_head.next;
}
// 反转原表
cur = head;
ListNode pre = null, next = cur.next;
while(cur != null){
next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
// 将反转的链表和复制的链表进行逐节点对比,如果完全相同就是回文链表
// 否则,不是回文链表
cur = dummy_node.next;
while(cur != null){
if(cur.val != pre.val)
return false;
cur = cur.next;
pre = pre.next;
}
return true;
}
} bool isPail(ListNode* head) {
if(!head||!head->next) return true;
ListNode* fast=head;
ListNode* slow=head->next;
while(fast->next&&fast->next->next)
{
fast=fast->next->next;
slow=slow->next;
}
//此时p在右半段链表的第一个位置
ListNode* pre=nullptr;
ListNode* next=nullptr;
while(slow)
{
next=slow->next;
slow->next=pre;
pre=slow;
slow=next;
}
while(head&&pre)
{
if(head->val!=pre->val)
return false;
head=head->next;
pre=pre->next;
}
return true;
} public boolean isPail(ListNode head) {
if (head == null) {
return false;
}
ListNode fast = head;
ListNode slow = head;
// 双指针获取后半段链表
while (fast.next != null && fast.next.next != null) {
fast = fast.next.next;
slow = slow.next;
}
// 获取后半段链表的翻转链表
ListNode lastHalfList = reverseList(slow.next);
// 遍历后半段链表,与前半段相比,每个结点都相等,则为回文结构
while (lastHalfList != null) {
if (lastHalfList.val != head.val) {
return false;
}
lastHalfList = lastHalfList.next;
head = head.next;
}
return true;
}
// 翻转链表
public ListNode reverseList(ListNode head) {
ListNode temp = null;
ListNode reversedList = null;
while (head != null) {
temp = head.next;
head.next = reversedList;
reversedList = head;
head = temp;
}
return reversedList;
} /**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
class Solution {
public:
/**
*
* @param head ListNode类 the head
* @return bool布尔型
* 使用字符串辅助,快速判断链表是否是回文结构
*/
bool isPail(ListNode* head) {
if (head == NULL) {
return true;
}
string s = "";
while(head) {
s += (head->val + '0');
head = head->next;
}
int i = 0;
int j = s.size() - 1;
while(i < j) {
if (s[i++] != s[j--]) {
return false;
}
}
return true;
}
};