假设是一个带头结点的链表,头结点就是无用的嘛,我是方便理解让他们从同一位置出发了嘛,就仿佛你们站在起跑线之外。假设小花同学和你(大叶同学)比赛玩跳跳棋,小花腿短一次只能跳一步,你(大叶同学)大长腿一次跳两步,赛程如果是奇数如下图。
图横着看,别大聪明地上下看,1、2、3分别代表第一次移动、第2次移动、第3次移动。
最后星星那里就是中点。代码就设成slow=fast=head
赛程如果是偶数如下图。
明显你到了终点,小花才到一半,看图,假设是奇数,那你就要走n/2+1(3/2+1=2整数除法咱计算机人都懂)次对吧,小花也是走n/2+1步,n/2就是左半拉,再加个1就是正中间;假设是偶数,你走完全程,小花走完左半拉,就是上中点;下中点也好说,那就是上中点的下一个就是p->next啦。
代码如下:
leetCode 234回文链表
这个题目是不带头结点的,也就是head指向的是第一个有用数据节点而非无用头结点,那么slow=head,fast=head->next,就相当于第一步走完了。
bool isPalindrome(ListNode* head) {
if(head==nullptr||head->next==nullptr)return true;
//上面那一句我是判断链表的长度是0则一定是回文链表,长度是1也一定是回文
ListNode *slow=head,*fast=head->next;
while(fast&&fast->next){
slow=slow->next;
fast=fast->next->next;
}//slow所指的是我的终点,之后逆置
这个判断语句,蛮不好想的,fast->next用来判断走没走到终点,那走到最后一个节点肯定就是fast->next==nullptr对吧,如果fast->next≠nullptr,那fast->next->next一定存在,不会出现不存在的情况,最多就是null对吧。那它是null了之后不又再次赋给fast了吗,那我肯定要再判断fast是否为nullptr,因为nullptr肯定没有next域,所以判断条件就是while(fast&&fast->next),而且fast放前头,0&x=0就不会往后判断了,你要是把fast->next放前头可就大错特错了。
刚才也说了,下中点就用slow->next就好,蛮不喜欢背好多程序的,容易乱。
就这样,bye~