leet-code:234-回文链表

179 阅读1分钟

1.通过快慢指针找到链表的中点:

  • 假设有一个链表 head: 1->2-3->4->3->2->1;
  public ListNode findMiddle(ListNode head){
    ListNode fast = head;
    ListNode slow = head;
    while(fast!=null&&fast.next.next!=null){
      fast = fast.next.next;
      slow = slow.next;
    }
    
    return slow;// 链表中点;
    
  }
  • 看图

快慢指针找到 表的中点节点.png

2.获取链表的后半部分:

  • 根据链表的长度 ,分两种情况
  • 链表长度是偶数,后半部分就直接是 slow
  • 链表长度是奇数,后半部分就是 slow.next

解释一下: 假如链表是: 1->2-3->4->3->2->1,那种slow指向的节点就是 4 ,所以节点的后半部分就要用slow.next 表示,

3.对链表的后半部分进行反转:

  • 反转以后的结果是:slow 就变成了:1->2->3

题外话:反转链表请看:leetcode 206


4.将head 的值付给fast:

  • fast的值就是:1->2-3->4->3->2->1;

注意:此时head的值依旧是:1->2-3->4->3->2->1;

5.用快慢指针的值做;

 while (slow != null) {
    if (fast.val != slow.val) {
       return false;
     }
      fast = fast.next;
      slow = slow.next;
 }
 return true;

6. 感谢