数据结构与算法之美,课后习题:06|链表(上):如何判断单链表回文字符串?

最新学习前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 }
View Code

 

  

posted @ 2019-05-05 09:23  菜鸡徐思  阅读(369)  评论(0编辑  收藏  举报