问题:
字符串是否为回文字符串,如abcba (单链表储存)
思路: 快慢指针找到中间节点,并且在慢指针移动时改变node的指向。
找到中间节点以后,从中间节点出发,前后遍历比较值
步骤: 1.判断传入节点是否为空,接下来节点是否为空(非空判断)
2.快慢指针移动,快指针正常移动,慢指针在移动时,改变node的指针方向,指向前一个
3.快指针无法移动时,对奇数情况做出特殊处理
4.开始比较,慢指针往后,pre指针往前,同时开始比较
代码如下(可直接运行):
public class SinglyLinedList {
public static void main(String[] args) {
ListNode node1=new ListNode(1);
ListNode node2=new ListNode(2);
ListNode node3=new ListNode(3);
ListNode node4=new ListNode(3);
ListNode node5=new ListNode(2);
ListNode node6=new ListNode(1);
node1.next=node2;
node2.next=node3;
node3.next=node4;
node4.next=node5;
node5.next=node6;
System.out.println(Solution.isPalindrome(node1));
}
public static class ListNode{
int val;
ListNode next;
ListNode(int x) { val = x; }
}
/*
思路:
快慢指针找到中间节点,并且在慢指针移动时改变node的指向。
找到中间节点以后,从中间节点出发,前后遍历比较值
步骤:
1.判断传入节点是否为空,接下来节点是否为空(非空判断)
2.快慢指针移动,快指针正常移动,慢指针在移动时,改变node的指针方向,指向前一个
3.快指针无法移动时,对奇数情况做出特殊处理
4.开始比较,慢指针往后,pre指针往前,同时开始比较
*/
static class Solution{
public static boolean isPalindrome(ListNode head){
if (head==null|| head.next==null){
return false;
}
ListNode fast=head;
ListNode slow=head;
ListNode pre=null;
//为了偶数情况下才进行这两个判断,画图可以得到,这样快指针移动时才不会报错
while (fast!=null&&fast.next!=null){
fast=fast.next.next;
ListNode next=slow.next;
slow.next=pre;//改变slow位置的next指针,指向前一个
pre=slow;//slow变为pre
slow=next;//slow往后移动
}
//奇数情况,slow往后一个,保证前后遍历时起点相同
if (fast!=null){
slow=slow.next;
}
//前后一起遍历
while (slow!=null){
if (slow.val!=pre.val){
return false;
}
slow=slow.next;
pre=pre.next;
}
return true;
}
}
}