首先,回文字串是指首位對稱的字串,如abcddcba、abcdcba。
下面以單鏈表的知識來**展示,如何判斷回文字串的。
//單鏈表資料結構
public
class
linknode
public
void
setnext
(linknode
next)
public string getdata()
public
void
setdata
(string data)
}
public boolean ishuiwen
(linknode head)
//慢指標
linknode slow = head;
//快指標
linknode fast = head;
//這個節點記錄 前半部分 反轉的鍊錶節點
//每次slow節點移動 prev節點跟著移動 將slow的下乙個節點指向prev
linknode prev = null;
//三個節點的形式是prev追slow,slow追fast,fast趕到終點
while
(fast != null && fast.next != null)
//如果字串是奇數個字元,如abcdcba,
if(fast != null)
while
(slow!=null)
slow=slow.next;
prev=prev.next;
}return
true
;}
採用快慢指標法,快指標fast每次跳兩個節點,慢指標slow每次跳乙個節點。當快指標走到鍊錶末尾或走出鍊錶時,慢指標剛好走到鍊錶中間或附近(視鍊錶長度是奇還是偶)。專門有個節點prev來用於記錄反轉過的鍊錶前半部分的節點(相當於對prev採用頭插法建立鍊錶)。最終只需要比較prev、slow節點的內容是否一致即可第一種情況:假設字串是偶數個,如abcddcba
鍊錶的指標畫的不太好話,請忽略指標畫法這個問題
第四次迴圈之後,fast為null,跳出while迴圈。此時prev鏈的節點資料為d->c->b->a;
這個時候 直接進入下面的乙個while迴圈,此時slow在第二個d處,此時prev的頭結點是d。
而slow從d變成null,還需要d->c->b->a
所以 第二個while迴圈 正常判斷完畢,最終結果為true。
第二種情況:假設字串是奇數個,如abcdcba
執行完第乙個while迴圈之後,fast!=null,因此如圖中所示slow=slow.next。
此時slow指向c,後面的節點分別是b->a
此時prev節點為c->b->a
最紅第二個while迴圈執行完畢,結果為true。
判斷單鏈表字串是否為回文字串
判斷單鏈表字串是否為回文字串 例如 abcba 上海自來水來自海上 思想 利用快慢指標,快指標一次走兩格,慢指標一次乙個,因為這個字串為單數,當快指標走到尾,慢指標正好走到中間,將這個中值儲存下來,利用乙個函式將後半部分反轉 因為中值已經被記錄,中值.next就是後半部分的head 用乙個比較函式比...
判斷字串是否為空
判斷字串是否為空是在 android 開發中是最長用的乙個判斷,判斷時也經常會看到有不同的判斷方式,今天專門研究了一下,記錄下來。先定義乙個字串,private string s 這種定義方式是我們學用的方式,那麼這樣定義時在字串時,該怎麼判斷它是不是空呢?來用 驗證一下 if s null els...
判斷字串是否為回文串
題目 給定乙個字串,驗證它是否是回文串,只考慮字母和數字字元,可以忽略字母的大小寫。說明 本題中,我們將空字串定義為有效的回文串。示例 1 輸入 a man,a plan,a canal panama 輸出 true 示例 2 輸入 race a car 輸出 false字串轉為小寫字串從字串開始和...