234.E 回文链表
Problem: 234. 回文链表
思路
思路1:把链表节点放到数组中,然后通过双指针遍历,两个指针一头一尾,分别往后和往前走,只要有一个位置不相等,那就不是回文。
这种思路的空间复杂度是O(N)
。
思路2:这道题的难点是指针不能从后往前遍历,因此考虑把后半段反转,然后就可以找到前半段和后半段的头结点,然后用双指针法进行遍历处理了。
Code
代码1:
func isPalindrome(head *ListNode) bool {
var nums []int
for head != nil {
nums = append(nums, head.Val)
head = head.Next
}
i, j := 0, len(nums)-1
for i < j {
if nums[i] != nums[j] {
return false
}
i++
j--
}
return true
}
代码2:
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func isPalindrome(head *ListNode) bool {
if head == nil {
return true
}
tail := tailOfFirstPart(head)
//反转后半段
secondPartHead := reverse(tail.Next)
for head != nil && secondPartHead != nil {
if head.Val != secondPartHead.Val {
return false
}
head = head.Next
secondPartHead = secondPartHead.Next
}
return true
}
func tailOfFirstPart(head *ListNode) *ListNode {
slow, fast := head, head
for fast.Next != nil && fast.Next.Next != nil {
fast = fast.Next.Next
slow = slow.Next
}
return slow
}
func reverse(head *ListNode) *ListNode {
var pre *ListNode
cur := head
for cur != nil {
temp := cur.Next
cur.Next = pre
pre = cur
cur = temp
}
return pre
}
Last updated
Was this helpful?