mirror of
https://github.com/halfrost/LeetCode-Go.git
synced 2025-07-05 00:25:22 +08:00
90 lines
1.8 KiB
Go
90 lines
1.8 KiB
Go
package leetcode
|
|
|
|
import (
|
|
"github.com/halfrost/LeetCode-Go/structures"
|
|
)
|
|
|
|
// ListNode define
|
|
type ListNode = structures.ListNode
|
|
|
|
/**
|
|
* Definition for singly-linked list.
|
|
* type ListNode struct {
|
|
* Val int
|
|
* Next *ListNode
|
|
* }
|
|
*/
|
|
|
|
// 解法一
|
|
func isPalindrome(head *ListNode) bool {
|
|
slice := []int{}
|
|
for head != nil {
|
|
slice = append(slice, head.Val)
|
|
head = head.Next
|
|
}
|
|
for i, j := 0, len(slice)-1; i < j; {
|
|
if slice[i] != slice[j] {
|
|
return false
|
|
}
|
|
i++
|
|
j--
|
|
}
|
|
return true
|
|
}
|
|
|
|
// 解法二
|
|
// 此题和 143 题 Reorder List 思路基本一致
|
|
func isPalindrome1(head *ListNode) bool {
|
|
if head == nil || head.Next == nil {
|
|
return true
|
|
}
|
|
res := true
|
|
// 寻找中间结点
|
|
p1 := head
|
|
p2 := head
|
|
for p2.Next != nil && p2.Next.Next != nil {
|
|
p1 = p1.Next
|
|
p2 = p2.Next.Next
|
|
}
|
|
// 反转链表后半部分 1->2->3->4->5->6 to 1->2->3->6->5->4
|
|
preMiddle := p1
|
|
preCurrent := p1.Next
|
|
for preCurrent.Next != nil {
|
|
current := preCurrent.Next
|
|
preCurrent.Next = current.Next
|
|
current.Next = preMiddle.Next
|
|
preMiddle.Next = current
|
|
}
|
|
// 扫描表,判断是否是回文
|
|
p1 = head
|
|
p2 = preMiddle.Next
|
|
// fmt.Printf("p1 = %v p2 = %v preMiddle = %v head = %v\n", p1.Val, p2.Val, preMiddle.Val, L2ss(head))
|
|
for p1 != preMiddle {
|
|
// fmt.Printf("*****p1 = %v p2 = %v preMiddle = %v head = %v\n", p1, p2, preMiddle, L2ss(head))
|
|
if p1.Val == p2.Val {
|
|
p1 = p1.Next
|
|
p2 = p2.Next
|
|
// fmt.Printf("-------p1 = %v p2 = %v preMiddle = %v head = %v\n", p1, p2, preMiddle, L2ss(head))
|
|
} else {
|
|
res = false
|
|
break
|
|
}
|
|
}
|
|
if p1 == preMiddle {
|
|
if p2 != nil && p1.Val != p2.Val {
|
|
return false
|
|
}
|
|
}
|
|
return res
|
|
}
|
|
|
|
// L2ss define
|
|
func L2ss(head *ListNode) []int {
|
|
res := []int{}
|
|
for head != nil {
|
|
res = append(res, head.Val)
|
|
head = head.Next
|
|
}
|
|
return res
|
|
}
|