判断一个链表是否是回文的。
利用的特性是将一个回文的链表reverse之后得到的链表不变...
可以利用一个栈,利用后进先出的特性简化操作。遍历两次链表即可。
时间代价O(n),空间代价也是O(n)的。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public boolean isPalindrome(ListNode head) {
Stack<Integer> nodeStack = new Stack<Integer>();
ListNode temp = head;
while(temp != null)
{
nodeStack.push(temp.val);
temp = temp.next;
}
temp = head;
while(temp != null)
{
if(temp.val != nodeStack.pop())
{
return false;
}
temp = temp.next;
}
return true;
}
}
其实还有空间代价为O(1)的方法,同样利用这个特性。
遍历一遍链表得到链表长度n。
之后reverse前n/2个节点(翻转前半个链表,仅需要一个辅助接点即可)。如n为偶数,从(n/2)+1开始;若n为奇数,从(n/2)+2开始逐个比较后半链表与reverse后的前半个链表(n/2->1),若各个节点都对应相等,怎是回文的。
实现起来具体不难