Leetcode Note: Go - Palindrome Linked List

Palindrome Linked List - LeetCode
https://leetcode.com/problems/palindrome-linked-list/

  • Go 言語で取り組んだメモ

所感

  • 回文になっているリンクリストか判定する

回答

Golang solution using two pointers - LeetCode Discuss
https://leetcode.com/problems/palindrome-linked-list/discuss/64572/Golang-solution-using-two-pointers

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func isPalindrome(head *ListNode) bool {

	// nil チェック
	if head == nil || head.Next == nil {
		return true
	}

	single, double := head, head
	var prev, prev2 *ListNode
	for {
		double = double.Next.Next

		// シングルノードが前のリストを反転
		prev = single
		single = single.Next
		prev.Next = prev2
		prev2 = prev

		// nil チェック
		if double == nil || double.Next == nil {
			break
		}
	}

	// 必要なノード数が均等になるように調整
	left, right := prev, single
	if double != nil {
		right = right.Next
	}

	for left != nil && right != nil {
		// 左右のノードが不一致なら false を返す
		if left.Val != right.Val {
			return false
		}
		left, right = left.Next, right.Next
	}

	return true
}