最新学习前google工程师王争大佬的《数据结构与算法之美》,06|链表(上):如何实现LRU缓存淘汰算法,
这章节课后习题:如何判断一个字符串是否是回文字符串的问题,如果字符串是通过单链表来存储,那么如何判断是一个回文串呢?
以下是思路:
使用快慢两个指针找到链表中点,慢指针走1步,快指针走2步。每次慢指针走过的路都要逆序,使得链表前半部分反序,最后再比
较两侧链表是否相等时,顺便逆序前半段,复原链表。注意区分奇偶。
时间复杂度:O(n)
空间复杂度:O(1)
代码(经过自己验证过,如果有不足请各位大佬们留言指出~):

1 bool HuiWenString(Node * pHead) 2 { 3 if (!pHead || !pHead->pNext) 4 { 5 return true; 6 } 7 bool bIsHuiWen = true; 8 Node * pPrev = pHead; //始终是慢指针(pSlow)前个节点,链表前半部分逆序的头节点,最后要与pSlow比较 9 Node * pTemp = NULL; //临时变量 10 Node * pSlow = pHead; //慢指针 11 Node * pFast = pHead; //快指针,用于帮助慢指针定位中间点。 12 while (pFast && pFast->pNext) //找中间节点 13 { 14 pFast = pFast->pNext->pNext; 15 //逆序前半段 16 pTemp = pPrev; 17 pPrev = pSlow; 18 pSlow = pSlow->pNext; 19 pPrev->pNext = pTemp; 20 } 21 Node * pPrevNext = pSlow;//pPrev的后一个节点,用于还原前半部分的逆序链表 22 23 if(!pFast)//奇 24 { 25 pSlow = pSlow->pNext; 26 } 27 while (pSlow) 28 { 29 if (bIsHuiWen) 30 { 31 if (pSlow->a != pPrev->a) 32 { 33 bIsHuiWen = false; 34 } 35 } 36 //再次逆序前半段,恢复链表 37 pTemp = pPrev->pNext; 38 pPrev->pNext = pPrevNext; 39 pPrevNext = pPrev; 40 pPrev = pTemp; 41 42 pSlow = pSlow->pNext; 43 } 44 pHead->pNext = pPrevNext; 45 return bIsHuiWen; 46 }