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;// 链表中点;
}
- 看图
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;