判斷一個鏈表是否爲迴文鏈表。golang
輸入: 1->2
輸出: false
複製代碼
輸入: 1->2->2->1
輸出: true
複製代碼
這裏使用golang
耍一遍,原理是同樣,語言只是其次。bash
/** * Definition for singly-linked list. * type ListNode struct { * Val int * Next *ListNode * } */
func isPalindrome(head *ListNode) bool {
if head == nil || head.Next == nil {
return true
}
lat := head.Next // 快指針,爲何從第二個開始,是爲了解決奇偶問題
pre := head // 慢指針
for lat != nil && lat.Next != nil {
lat = lat.Next.Next
pre = pre.Next
}
cur := pre.Next // 保留後面尚未遍歷的鏈表
pre.Next = nil // 將整個列表進行截斷,保存爲 第一個鏈表
p := reverseLink(cur) // 將後面的鏈表倒序
// 比較兩個鏈表
for p != nil && head != nil {
if p.Val != head.Val {
return false
}
p = p.Next
head = head.Next
}
return true
}
// reverseLink 將鏈表倒序
func reverseLink(listHead *ListNode) *ListNode {
if listHead == nil && listHead.Next == nil {
return listHead
}
p := listHead // 遍歷鏈表的指針
var rst *ListNode // 保存最後結果鏈表的指針
var q *ListNode // 保存下一個節點的臨時指針
// 這裏不清楚的拿紙和筆畫一下就明白了
for p != nil {
q = p.Next
p.Next = rst
rst = p
p = q
}
return rst
}
複製代碼
徹底使用鏈表操做就能夠將空間複雜度降到O(1)。spa