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?