学习时间:
首先想到的是根据当前链表构建一个反向链表,同时遍历两个链表,比较对应节点的值是否相同,若存在值不等的节点,返回 false,否则返回 true,实现代码如下。
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func isPalindrome(head *ListNode) bool {
var t2 = new(ListNode)
t2.Val = head.Val
t2.Next = nil
for t:=head; t.Next!=nil; t=t.Next{
var t1 = new(ListNode)
t1.Val = t.Next.Val
t1.Next = t2
t2 = t1
}
i:=head
j:=t2
for ; i!=nil && j!=nil; {
if i.Val!=j.Val{
return false
}
i=i.Next
j=j.Next
}
return true
}
题解2是看了官方给的解题方法,脑子愣了一下,其实题目很简单,遍历链表各个节点的值。将值按序依次存入链表中,假设列表总长l,比较位置 i 与 (l-i)/2位置的值是否相同,若相同返回 true,否则返回 false。实现代码如下。
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func isPalindrome(head *ListNode) bool {
var l []int
for t:=head; t!=nil; t=t.Next {
l = append(l, t.Val)
}
length := len(l)
for k, v := range(l[:length/2]) {
if v!=l[length-k-1]{
return false
}
}
return true
}