user-0 提问: 判断回文链表，我用的快慢指针的逻辑，求帮找bug。

回复:
user: user-1
content: 想用单链表处理  你得做链表逆置 然后用逆置链表生成链表2 逆置链表重新逆置 最后比较原链表和链表2 才能得出结论

user: user-1
content: 快慢指针无法处理回文  看代码你似乎期望 prev 从头开始  slow 从中间开始 然后依次比较  问题是 这样比较true 应该是类似这种 123123 而不是 123321

user: user-0
content: 引用 4 楼 遇见女神 的回复:while (fast != null && fast.next != null) {   fast = fast.next.next;   ListNode next = slow.next;   slow.next = prev;   prev = slow;   slow = next; }  if (fast != null) {   slow = slow.next; }  while (slow != null) {   if (slow.val != prev.val) {     return false;   }   slow = slow.next;   prev = prev.next; } 你的就是把我之前快走的move放到第一行了。然后把fast这步改为每次单独创建一个next，附上slow.next的值。这个和我直接创建一个fast，将其赋给slow，然后每次最后给fast赋值fast.next。有什么不一样吗？  之前单独写反转链表用我写的那个方法没出现问题。所以现在很困惑。

user: user-2
content: 单向链表的话，用栈都比用这啥快慢指针来的好。这什么快慢指针根本不搭边

user: user-2
content: 而且回文始终有个问题： 他是两边往中间（即一个向左一个向右）  或 中间往两边（即一个向右一个向左） 进行比较的  括号中说的很明白了，方向。既有向左的又有向右的，所以这里用双向链表相对于使用单向链表来解决是极其自然的。

user: user-2
content: 12321是回文吧， 既然是快指针fast，那我以为步长最少是2没问题吧 假设fast初始指向第一个1。再往后的步进中，有没有机会指向值：2？ 假设fast初始指向第一个2，再以后的步进中，有没有机会指向值：1和3？  所以这种情境下，fast指针在步长为2的情况下，无论怎么跑都没有机会能指向所有数据。那此时fast指针能依靠来作为回文检定吗？ 我估计可能不行吧

user: user-0
content: 引用 9 楼 遇见女神 的回复:噗哈哈哈。 你都没看清楚，计算也没记清楚。 举例说明，两个结点的链表，你的代码第一个while循环体执行一遍，问你： 1，循环体内第一行代码是不是把首结点的next赋值为null？ 2，多余的move是不是初始化指向首结点呢？ 3，move->next是不是null了？  明白了明白了，终于明白了。用自己理想的逻辑，瞎想了半天。修改两处后，运行结果是对的了。非常感谢，早点遇见女神啊！ bool isPalindrome(struct ListNode* head){      struct ListNode* pre = NULL, * slow = head, * fast = head, *move = head;    //这里*fast = head.next改为* fast = head；     while(move != NULL && move->next != NULL)     {         move = move->next->next;     //move和fast的移位，这两行移到最前面来，就是计划的值，而不会被修改。         fast = fast->next;         slow->next = pre;         pre = slow;         slow = fast;     }     if(move != NULL)     {         fast = fast->next;     }     while(fast && slow)     {         if(fast != slow)             return false;         slow = slow->next;         fast = fast->next;     }     return true; }

user: user-3
content: 引用 5 楼 Stranger_Green 的回复：[quote=引用 4 楼 遇见女神 的回复:]  while (fast != null && fast.next != null) {   fast = fast.next.next;   ListNode next = slow.next;   slow.next = prev;   prev = slow;   slow = next; }  if (fast != null) {   slow = slow.next; }  while (slow != null) {   if (slow.val != prev.val) {     return false;   }   slow = slow.next;   prev = prev.next; } 你的就是把我之前快走的move放到第一行了。然后把fast这步改为每次单独创建一个next，附上slow.next的值。这个和我直接创建一个fast，将其赋给slow，然后每次最后给fast赋值fast.next。有什么不一样吗？  之前单独写反转链表用我写的那个方法没出现问题。所以现在很困惑。[/quote]“有什么不一样？” run my code right run your code wrong  就这个不一样而已。

user: user-3
content: 噗哈哈哈。 你都没看清楚，计算也没记清楚。 举例说明，两个结点的链表，你的代码第一个while循环体执行一遍，问你： 1，循环体内第一行代码是不是把首结点的next赋值为null？ 2，多余的move是不是初始化指向首结点呢？ 3，move->next是不是null了？

user: user-0
content: 引用 6 楼 lin5161678 的回复:快慢指针无法处理回文  看代码你似乎期望 prev 从头开始  slow 从中间开始 然后依次比较  问题是 这样比较true 应该是类似这种 123123 而不是 123321 我的逻辑就是把链表的前一半逆转，然后前后同时比较。 move每次移动两个位置，pre和slow和fast是用来做逆转用的，每次都只移动一个位置。 所以，move或者move.next为空时，slow差不多在一般的位置。奇偶不同，slow再next一下。 最后一个while里面，是将fast的值赋给slow了，这里slow还没反转，所以指向的是后半部分的链表。而pre已经是反转后的前半部分链表的第一个。 最后slow和pre同时next比较值。

user: user-3
content: while (fast != null && fast.next != null) {   fast = fast.next.next;   ListNode next = slow.next;   slow.next = prev;   prev = slow;   slow = next; }   if (fast != null) {   slow = slow.next; }   while (slow != null) {   if (slow.val != prev.val) {     return false;   }   slow = slow.next;   prev = prev.next; }

user: user-4
content: 判断回文用双链表啊，头→     ←尾 这样比较才好弄啊。你用单链表不借助辅助空间，极度复杂的，屁都弄出来了。然后你这算法是不对的。

user: user-0
content: 引用 1 楼 自信男孩 的回复:/*     if(head == NULL|| head->next == NULL)     {         return true;     }     */     if (head == NULL)         return true;     if (head->next == NULL)         return true;  这个地方需要改一下。  楼主创建双向链表比较容易解决这个问题～  感觉这里应该没什么大问题。 比如输入的是1,2,3,4,3,2,1，原本这个应该是回文链表，但是我输出的是false; 或者输入1,2，不是回文链表，我的结果却是true。 我自己在纸上跟着代码走了下，每步，看着像没什么问题啊。但不知道为什么结果老不对。

user: user-5
content: /*     if(head == NULL|| head->next == NULL)     {         return true;     }     */     if (head == NULL)         return true;     if (head->next == NULL)         return true;  这个地方需要改一下。  楼主创建双向链表比较容易解决这个问题～