聰明的我想到了利用棧先進後出的特性,求出鍊錶的長度之後前一半入棧,後一半出棧的方法,雖然簡單易懂,但是效率有點低,貼**
/** * definition for singly-linked list.
* struct listnode
* listnode(int x) : val(x), next(nullptr) {}
* listnode(int x, listnode *next) : val(x), next(next) {}
* }; */
class
solution
nice =head;
intj;
for(j = 0 ; j < i/2 ; j++)
if(i-2*j)
nice = nice->next;
for(; j > 0 ; j--)
else
return
false
; }
if(good.empty())
return
true
;
else
return
false
; }
};
遞迴的方法相當巧妙,畫畫圖對著**應該能整明白,下面貼**
/** * definition for singly-linked list.
* struct listnode
* listnode(int x) : val(x), next(nullptr) {}
* listnode(int x, listnode *next) : val(x), next(next) {}
* }; */
class
solution
return
true
; }
bool ispalindrome(listnode*head)
};
最巧妙的是一旦遞迴中有一步返回false,就會觸發連鎖反應,false到盡頭,雖然效率很差。
還有一種方法,通過快慢指標,找到節點的中間位置,然後通過反轉鍊錶的方法,將後部分翻轉,並進行比較
新增一下該做法的**,最具參考意義的是翻轉鍊錶的過程,其中用了虛頭部來實現不斷的翻轉,貼**
1/**2* definition for singly-linked list.
3* struct listnode
7* listnode(int x) : val(x), next(nullptr) {}
8* listnode(int x, listnode *next) : val(x), next(next) {}
9* };
10*/
11class
solution
29//
長度為奇數
30if
(fast)
31 slow = slow->next;
32//
虛頭的next指標指向反轉後鍊錶的頭結點
33 listnode* halfhead = dummyhead->next;
34while(slow &&halfhead)
3541
return
true
; 42}
43 };
LeetCode 234 判斷回文鍊錶(c語言)
以前有過判斷回文串,但是對於回文鍊錶,由於鍊錶具有不可回溯性,所以可能需要借用一定空間。請判斷乙個鍊錶是否為回文鍊錶。示例 1 輸入 1 2 輸出 false 示例 2 輸入 1 2 2 1 輸出 true 高階 你能否用 o n 時間複雜度和 o 1 空間複雜度解決此題?1.找到鍊錶的中點。法一 ...
LeetCode 234 回文鍊錶
請判斷乙個鍊錶是否為回文鍊錶。definition for singly linked list.struct listnode bool ispalindrome struct listnode head 示例 1 輸入 1 2 輸出 false 示例 2 輸入 1 2 2 1 輸出 true 要...
leetcode 234 回文鍊錶
請判斷乙個鍊錶是否為回文鍊錶。示例 1 輸入 1 2輸出 false 示例 2 輸入 1 2 2 1輸出 true 解法1 使用棧 使用快慢指標找中點,原理是每次快指標走兩步,慢指標走一步,等快指標走完時,慢指標的位置就是中點。我們還需要用棧,每次慢指標走一步,都把值存入棧中,等到達中點時,鍊錶的前...