判斷回文鍊錶

2022-07-12 03:00:11 字數 1880 閱讀 8477

請判斷乙個鍊錶是否為回文鍊錶。鍊錶為單向無環鏈表

示例 1:

輸入: 1->2

輸出:

false

示例 2:

輸入: 1->2->2->1

輸出:

true

這題是讓判斷鍊錶是否是回文鍊錶,所謂的回文鍊錶就是以鍊錶中間為中心點兩邊對稱。我們常見的有判斷乙個字串是否是回文字串,這個比較簡單,可以使用兩個指標,乙個最左邊乙個最右邊,兩個指標同時往中間靠,判斷所指的字元是否相等。

但這題判斷的是鍊錶,因為這裡是單向鍊錶,只能從前往後訪問,不能從後往前訪問,所以使用判斷字串的那種方式是行不通的。但我們可以通過找到鍊錶的中間節點然後把鍊錶後半部分反轉,最後再用後半部分反轉的鍊錶和前半部分乙個個比較即可。這裡以示例2為例畫個圖看一下。

最後再來看下**:

public

boolean

ispalindrome(listnode head)

//如果fast不為空,說明鍊錶的長度是奇數個

if (fast != null

)

//反轉後半部分鍊錶

slow =reverse(slow);

fast=head;

while (slow!=null

) slow=slow.next;

fast=fast.next;

}return

true

; }

//反轉鍊錶

public

listnode reverse(listnode head)

return

pre;

}

我們知道棧是先進後出的一種資料結構,這裡還可以使用棧先把鍊錶的節點全部存放到棧中,然後再乙個個出棧,這樣就相當於鍊錶從後往前訪問了,通過這種方式也能解決,看下**:

public

boolean

ispalindrome1(listnode head)

listnode temp =head;

stack

stack = new

stack();

int len = 0;

while (temp != null

)

//長度除以2

len >>= 1;

while (len-- > 0)

head =head.next;

}return

true

; }

listnode temp;

public

boolean

ispalindrome2(listnode head)

private

boolean

check(listnode head)

//逆序列印鍊錶

boolean res = check(head.next) && (temp.val ==head.val);

temp =temp.next;

return

res;

}

回文鍊錶的判斷,相比回文字串的判斷稍微要麻煩一點,但難度也不是很大,如果對鍊錶比較熟悉的話,這3種解決方式都很容易想到,如果不熟悉的話,可能最容易想到的就是第2種了,也就是棧和鍊錶的結合。

鍊錶回文判斷

判斷一條單向鍊錶是不是 回文 回文,英文palindrome,指順著讀和反過來讀都一樣。判斷回文單向鍊錶跟判斷回文字串很大的區別就是遍歷。字串可以自由向前遍歷,而單向字串不行,因此最簡單直觀的思路就是將鍊錶翻轉,然後再進行比較。但是這種方法就比較笨,因為還需要建立另外乙個單鏈表來儲存原有的單鏈表,然...

鍊錶 (判斷回文鍊錶)演算法

coding utf 8 author leadingme mail leadingme qq.com mywebsite leadingme.top 回文鍊錶 演算法要求 判斷乙個鍊錶是否為回文鍊錶 示例1 輸入 1 2 輸出 false 示例2 輸入 1 2 2 1 輸出 true class ...

判斷鍊錶是否回文?

given a singly linked list,determine if it is a palindrome.思路 兩個指標,乙個正常遞推,另乙個遞推速度為第乙個的兩倍 node.next.next 到末,分兩種情況 1.奇數個元素,最後快指標指向最後乙個元素 p2.next null 2....