回文链表

思路:首先找到链表的中心节点,然后从中心节点的下一位开始进行翻转。
 
然后以rHead!=null作为循环条件,lHead和rHead不断循环下去,不断比较,当出现节点比较不相等时,直接return false即可。
 
 
需要解决的问题:
如何找到中心节点?(快慢指针思想)
定义两个指针,一个slow指针,一个fast指针,指向head头结点
 
 
其中fast指针一次走两步,慢指针一次走一步,由于快指针较快且是慢指针的两倍,当快指针到终点时或者它的第二步为空时,此时slow恰好是中点。
 
代码如下:
private ListNode middleNode(ListNode head) {
     // 利用快慢指针获得中心节点
     ListNode slow=head;
    ListNode fast=head;
     while (fast. next != null &&fast. next . next != null ){
        slow=slow. next ;
        fast=fast. next . next ;
    }
     return slow;
}
 
 
 
接着解决翻转问题:
翻转问题比较好解决,首先定义一个newHead为空的节点,把需要翻转的加入,由于链表是顺序的,通过temp保存当前节点的下一位,让当前节点head的下一位指向newHead,newHead再指向head,即可完成指向,最后把temp节点赋值给head。
例如传入的链表为1-》2-》null
此时head=1,temp=2,newHead=null;
首先head.next=newHead 相当于1-》null
     newHead=head; newHead的值此时指向1,
最后把head=temp head为2
按照上诉步骤不断循环下去
private ListNode reverseList(ListNode head) {
    ListNode newHead= null ;
     while (head!= null ){
        ListNode tmp=head. next ;
        head. next =newHead;
        newHead=head;
        head=tmp;
    }
     return newHead;
}
 
 
 
总体代码:
public boolean isPalindrome(ListNode head) {
     if (head == null || head. next == null ) return true ;
     if (head. next . next == null ) return head. val == head. next . val ;
    ListNode lHead=head;
    ListNode mid=middleNode(head);
    ListNode rHead=reverseList(mid. next );
     while (rHead!= null ){
         if (rHead. val !=lHead. val ) return false ;
        rHead = rHead. next ;
        lHead = lHead. next ;
    }
     return true ;
}
 
private ListNode reverseList(ListNode head) {
    ListNode newHead= null ;
     while (head!= null ){
        ListNode tmp=head. next ;
        head. next =newHead;
        newHead=head;
        head=tmp;
    }
     return newHead;
}
 
private ListNode middleNode(ListNode head) {
     // 利用快慢指针获得中心节点
     ListNode slow=head;
    ListNode fast=head;
     while (fast. next != null &&fast. next . next != null ){
        slow=slow. next ;
        fast=fast. next . next ;
    }
     return slow;
}
 
 
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值