234. 回文链表 简单

请判断一个链表是否为回文链表。

示例 1:

输入: 1->2
输出: false

示例 2:

输入: 1->2->2->1
输出: true

进阶
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?

代码参考:

package main

import "fmt"

func main() {
    fmt.Println(isPalindrome(newList([]int{1, 2})))
    fmt.Println(isPalindrome(newList([]int{1, 2, 2, 1})))
    fmt.Println(isPalindrome(newList([]int{1, 2, 3, 2, 1})))
}

// 将前半段链表反转到新链表,再逐一对比新链表与后半段链表是否一致
func isPalindrome(head *ListNode) bool {
    if head == nil || head.Next == nil {
        return true // 注意 []、[1] 是回文结构
    }

    n := 0
    cur := head
    for cur != nil {
        n++
        cur = cur.Next
    }
    mid := n / 2 // 找到中间节点

    cur = head
    newHead := &ListNode{Val: head.Val} // 遍历新建前半段链表
    i := 0
    for i < mid-1 {
        cur = cur.Next
        newHead = prepend(newHead, cur.Val)
        i++
    }

    cur = cur.Next // 选取要开始遍历的后半段链表
    if n%2 == 1 {
        cur = cur.Next
    }

    for newHead != nil && cur != nil {
        if newHead.Val != cur.Val {
            return false
        }
        cur = cur.Next
        newHead = newHead.Next
    }

    return true // 对称
}

// 新增 head
func prepend(head *ListNode, v int) (newHead *ListNode) {
    node := &ListNode{Val: v}
    if head == nil {
        return node
    }
    node.Next = head
    return node
}
最后编辑: kuteng  文档更新时间: 2021-06-05 10:16   作者:kuteng