判断一个链表是否是回文链表
判断一个链表是否是回文链表
回文链表
1.找到中间结点
2.中间位置之后的链表翻转
上述两个的方法上两篇文章有写过
3.将第一个链表与第二个链表一次向后遍历,比较
1-2-3-2-1
1-2-3-1-2;
if(A==null){
return false;
}
//找到中间节点
ListNode first=A;
ListNode mid=A;//中间结点,作为下一个链表的前驱结点
//找到中间节点,奇数为中间的,偶数为中间两个的前一个
while(first.next!=null){
if(first.next.next!=null){//奇数情况(在最后一步时一定会进入此分支)
first=first.next.next;
mid=mid.next;
}else{//偶数情况,(最后一步一定会进此分支)
first=first.next;//走这一步是为了结束循环
}
}
ListNode prev=mid;
ListNode first_1=mid.next;
if(first_1==null){//如果中间节点的下一个结点为空,那么链表中只有一个结点
return true;
}
ListNode second=first_1.next;
if(second==null){//如果中间节点的下两个节点为空,中间节点的两边一定只有一个结点 1-2-1结构
return A.val==first_1.val;
}
while(second!=null){//将中间节点后面的结点翻转
first_1.next=second.next;
second.next=prev.next;
prev.next=second;
second=first_1.next;
}
ListNode temp=A;
mid=mid.next;
while(mid!=null){//比较
if(mid.val!=temp.val){
break;
}
mid=mid.next;
temp=temp.next;
}
if(mid==null){//如果是回文链表。那么一定走到了链表尾部
return true;
}
return false;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
方法二:将每一个结点的值放到数组里,然后进行比较
public class PalindromeList {
public boolean chkPalindrome(ListNode A) {
// write code here
int size=0;
for(ListNode temp=A;temp!=null;temp=temp.next){
size++;
}
int[] datas=new int[size];
int i=0;
for(ListNode temp=A;temp!=null;temp=temp.next){
datas[i++]=temp.val;
}
i=i-1;
int j=0;
for (j=0,i=size-1;j<i;j++,i--){
if(datas[i]!=datas[j]){
break;
}
}
if(i<=j){
return true;
}
return false;
}
---------------------
作者:章鱼四剑客
来源:CSDN
原文:https://blog.csdn.net/weixin_42139044/article/details/88190642
版权声明:本文为博主原创文章,转载请附上博文链接!

浙公网安备 33010602011771号