https://leetcode.cn/problems/palindrome-linked-list/description/?envType=problem-list-v2&envId=2cktkvj

双指针,一个往后读一个往前读,如果不一样就false,否则就是回文链表

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func isPalindrome(head *ListNode) bool {
    var cur *ListNode = head
    var arr []int = []int{}
    for cur != nil {
        arr = append(arr,cur.Val)
        cur = cur.Next
    }
    start := 0
    end := len(arr) - 1
    for start < end {
        if arr[start] != arr[end] {
            return false
        }
        start++
        end--
    }
    return true

}

或者copy一个链表,把它反转了,和原来的链表一个一个比较,如果反转后的和原来的一样就是回文链表

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
 func reverseList(head *ListNode) *ListNode {
    var reversedHead *ListNode = nil
    for head != nil {
        // 保存下一个节点
        next := head.Next
        // 将当前节点插入到反转链表的头部
        head.Next = reversedHead
        reversedHead = head
        // 移动到下一个节点
        head = next
    }
    return reversedHead
}
func copyList(head *ListNode) *ListNode {
    if head == nil {
        return nil
    }
    newHead := &ListNode{Val: head.Val}
    cur := newHead
    for head.Next != nil {
        head = head.Next
        cur.Next = &ListNode{Val: head.Val}
        cur = cur.Next
    }
    return newHead
}

func isPalindrome(head *ListNode) bool {
    if head == nil || head.Next == nil {
		return true
	}
    copiedHead := copyList(head)
	reversedHead := reverseList(copiedHead)
	
	// 比较原链表和反转后的链表
	p1, p2 := head, reversedHead
	for p1 != nil && p2 != nil {
		if p1.Val != p2.Val {
			return false
		}
		p1 = p1.Next
		p2 = p2.Next
	}

	return true
}