给定一个链表的头结点head,请判断该链表是否为回文结构
例::1->2->2->1,返回true
1->2->3,返回false
方法一:
将链表的右半部分进行反转,最后指向中间节点。比较左半部分和右半部分的值是否相等。
核心代码:
public boolean isHuiWen() {
if (this.head == null) {
return false;}
else if(this.head.next==null) { //只有一个结点的时候,肯定是 回文
return true;
}
Node fast = this.head;
Node slow = this.head;
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
}
Node p = slow.next;
Node pNext = p.next;
while (p != null) {//反转
p.next = slow;
slow = p;
p = pNext;
if(p!=null){
pNext=p.next;
}
}
while (head != slow) {
if (head.data != slow.data) { //左右不想等
return false;
}
if (head.next == slow) {
return true;
}
head = head.next;
slow = slow.next;
}
return true;
}
方法二:
利用栈结构,从左到右遍历链表,将链表中的每个节点入栈。因为栈是后进先出,所以在遍历完成后,栈顶到栈底的结点值的顺序会与原来的相反。如果逆序后,他们相同,则是回文结构。
public boolean isHuiWen(){
Stack<Node> stack=new Stack<Node>();
Node currency=this.head;
while(currency!=null){
stack.push(currency);
currency=currency.next; //依次入栈
}
while(this.head!=null){
if(this.head.data!=stack.pop().data){ //判断入栈的顺序和出栈的顺序是否一致,一样
return false;
}
head=head.next;
}
return true;
}
方法三:
没有将所有的结点都压入栈中,只需要压入一半。将整个链表的右半部分压入栈中,压入完成后,检查栈顶到栈底值出现的顺序是否和链表左半部分的值相等。
例:1->2->3->2->1,将右半部分压入栈,从栈顶到栈底,1,2.和左半部分一样,所以该链表为回文结构。
public boolean isHuiWen1(){
if(this.head==null||this.head.next==null){
return true;
}
Node right=head.next; //右半区
Node currency=this.head;
while(currency.next!=null&¤cy.next.next!=null){
right=right.next;
currency=currency.next.next;
}
Stack<Node> stack=new Stack<Node>();
while(right!=null){
stack.push(right);
right=right.next;
}
while(!stack.isEmpty()){
if(this.head.data!=stack.pop().data){
return false;
}
this.head=this.head.next;
}
return true;
}