234.回文链表

90 阅读1分钟

题目:
给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。
算法: 链表反转

func isPalindrome(head *ListNode) bool {
	fast, slow := head, head

    count := 0
	for fast != nil {
		if fast.Next == nil {
            count ++
			fast = fast.Next 
		} else {
            count += 2
            fast = fast.Next.Next
        }
		
		slow = slow.Next
        
	}
	// fmt.Println(slow.Val)
	var pre *ListNode
	cur := head
   
	for cur != slow {
		next :=  cur.Next
		cur.Next = pre
		pre = cur
		cur = next
        
	}
    if count % 2 == 1 {
        pre = pre.Next
    }
    // fmt.Println(count, pre.Val, cur.Val, slow.Val)
	for pre != nil {
		fmt.Println(pre.Val, slow.Val)
		if pre.Val != slow.Val {
			return false
		}
		pre = pre.Next
		slow = slow.Next
	}
	return true
}

更清晰的版本 注意链表节点只有1、2个的情况

func isPalindrome(head *ListNode) bool {
	firstHalfStart := head
    firstHalfEnd := findFirstHalfEnd(head)
	secondHalfStart := revert(firstHalfEnd.Next)
	for secondHalfStart != nil{
		if firstHalfStart.Val != secondHalfStart.Val {
			return false
		}
		firstHalfStart = firstHalfStart.Next
		secondHalfStart = secondHalfStart.Next
	}
	return true
}

func findFirstHalfEnd(head *ListNode) *ListNode {
	fast, slow := head, head
	for fast.Next != nil && fast.Next.Next != nil {
        fast = fast.Next.Next
		slow = slow.Next  
	}
	return slow
}

func revert(head *ListNode) *ListNode {
	cur := head
	var pre *ListNode
	for cur != nil {
		next := cur.Next		
		cur.Next = pre
		pre = cur
		cur = next
	}
	return pre
}