题目
对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。
给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。
测试样例: 1->2->2->1 返回:true
思路:
1.先将链表A拷贝到另一个新建链表B中
2.再将链表B反转(http://t.csdn.cn/X3y26)
3.将反转后的链表B和链表A进行比较,并返回
代码:
public class PalindromeList {
public boolean chkPalindrome(ListNode A) {
// write code here
if(A == null || A.next == null){
return true;
}
//把原来的链表复制一份
ListNode newHead = new ListNode(0);
ListNode newTail = newHead;
for(ListNode cur = A;cur != null;cur = cur.next){
newTail.next = new ListNode(cur.val);
newTail = newTail.next;
}
ListNode B = newHead.next;
//把新链表逆置
ListNode preNode = null;
ListNode curNode = B;
ListNode nextNode = curNode.next;
while(curNode != null){
nextNode = curNode.next;
if(nextNode == null){
B= curNode;
}
curNode.next = preNode;
preNode = curNode;
curNode = nextNode;
}
//比较
ListNode cur1 = A;
ListNode cur2 = B;
while(cur1 != null && cur2 != null){
if(cur1.val != cur2.val){
return false;
}
cur1 = cur1.next;
cur2 = cur2.next;
}
return true;
}