使用單鏈表來判斷字串是否為回文字串

2021-09-29 11:27:49 字數 1627 閱讀 6597

首先,回文字串是指首位對稱的字串,如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字串轉為小寫字串從字串開始和...