234. 回文链表
题目描述
给你一个单链表的头节点 head
,请你判断该链表是否为回文链表。如果是,返回 true
;否则,返回 false
。
输入输出
1 2 3 4 5
| 输入:head = [1,2,2,1] 输出:true
输入:head = [1,2] 输出:false
|
基本思路
slow
和fast
双指针同时从head
开始走 slow
走一步 fast
走两步
- 如果链表数量为奇数
1->2->3->2->1->null
slow
在第二个2 fast
在null
- 如果链表数量为偶数
1->2->2->1->null
slow
在3 fast
在1 此时slow
要往后移一位
- 从
slow
这个位置开始到最后进行反转 依次比较每个值是否相等
tip:
若想不影响链表结构 可以p.next = reverse(q);
恢复
java实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| class Solution { public boolean isPalindrome(ListNode head) { ListNode slow = head, fast = head, p = head; while(fast != null && fast.next != null){ slow = slow.next; fast = fast.next.next; } if(fast != null){ slow = slow.next; } ListNode right = reverse(slow); while(right != null){ if(right.val != p.val){ return false; } right = right.next; p = p.next; } return true; } public ListNode reverse(ListNode head){ ListNode pre = null, cur = head; while(cur != null){ ListNode new_head = cur.next; cur.next = pre; pre = cur; cur = new_head; } return pre; } }
|