题目描述:
请编写一个函数,检查链表是否为回文。给定一个链表ListNode* pHead,请返回一个bool,代表链表是否为回文。
测试样例:
{1,2,3,2,1}
返回:true
{1,2,3,2,3}
返回:false
思路一:
先把链表值存到栈中 然后遍历链表与栈弹出的值比较。栈中的值是从尾到头的这样就实现了第一个与倒数第一个匹配比较如果不一样则返回false
public boolean isPalindrome(ListNode pHead)
{
if(pHead==null)
{
return false;
}
Stack<Integer> st = new Stack<Integer>();
ListNode p=pHead;
while(p!=null)
{
st.push(p.val);
p=p.next;
}
p=pHead;
while(p!=null&&!st.isEmpty())
{
if(p.val!=st.pop())
{
return false;
}
p=p.next;
}
return true;
}
这种方法比较直观也比较简单时间复杂度为2n
思路二:
快慢指针
快指针一次走两步 慢指针一次走一步
偶数长度情况:
{1,2,3,4,4,3,2,1}快指针走到头 慢指针刚好走到4的位置,如果慢指针在走的时候用栈记录遍历的数据则此时栈中的数据为 {4,3,2,1} 如果链表为回文链表则 用慢指针遍历链表与栈弹出的值比较 每个值都相等。否则则不是回文链表。
奇数长度情况
{1,2,3,4,3,2,1}快指针走到头 慢指针刚好走到3的位置,慢指针在走的时候用栈记录遍历的数据则此时栈中的数据为 {3,2,1}
4为中间数字我们跳过这个数字,如果链表为回文链表则 用慢指针遍历链表与栈弹出的值比较 每个值都相等。否则则不是回文链表。
public boolean isPalindromee(ListNode pHead)
{
ListNode fast=pHead;//快指针
ListNode low=pHead;//慢指针
Stack<Integer> st = new Stack<Integer>();
while(fast!=null&&fast.next!=null)///因为快指针一次走两步所以要满足当前节点和下一节点都不为空
{
st.push(low.val);
fast=fast.next.next;//快指针一次走两步
low=low.next;//慢指针一次走一步
}
if(fast!=null)//通过fast是否为空判断链表是否为奇数如果为奇数则要跳过中间数字
{
low=low.next;
}
while(low!=null)
{
if(low.val!=st.pop())//链表后半段与栈中存储的前半段比较
{
return false;
}
low=low.next;
}
return true;
}
因为只计算了low指针从头到尾遍历了一遍链表则时间复杂度为n
作者:pipiang
来源:优快云
原文:https://blog.youkuaiyun.com/pipiang/article/details/79337121
版权声明:本文为博主原创文章,转载请附上博文链接!