1.回文链表
要求:单链表来判断是否是回文串(正反相同),如果是返回true,不是返回false。
首先求得回文串中的中间位置,因为回文串两边的头节点往中间靠拢,在相同的情况下,如果两边头节点相遇则是回文串
这里我们的fast和slow都从head头部同时走,但是fast一次走两步slow一次只走一步,当fast走到最后一个节点的next为null时或者是走到null时(奇数和偶数的问题),则slow这个位置正好是我们的中间位置。
因为是单链表我们需要将中间点的后续节点翻转,从而由最后一个节点开始走知道slow的下一个节点指向slow,将slow下一个节点给到cur对象,让cur的下一个节点指向slow。
如果cur下一个节点指向slow的话,cur就会失去后续节点的链接,所以我们还需要一个对象来接收cur的下一个节点
这里我们先将curNext=cur.next获取到cur下一个节点,将cur.next指向slow
然后slow=cur将slow更新为头步
然后cur=curNext,cur的节点更新,知道找到最后一个节点
代码
public static boolean isPalindrome(MyLinkedList.NodeList head) {
MyLinkedList.NodeList fast=head;
MyLinkedList.NodeList slow=head;
while(fast!=null && fast.next!=null){
fast=fast.next.next;
//slow出循环后slow就是中间位置
slow=slow.next;
}
MyLinkedList.NodeList cur=slow.next;
while(cur!=null){
MyLinkedList.NodeList curNext = cur.next;
cur.next=slow;
slow=cur;
cur=curNext;
}
//这里head和sl