回文链表两种方法

76 阅读1分钟
    func IsPalindrome(head *StrNode) bool {
    vals := []string{}
    for ; head != nil; head = head.next {
        vals = append(vals, head.str)
    }
    n := len(vals)
    for i, v := range vals[:n/2] {
        if v != vals[n-1-i] {
            return false
        }
    }
    return true
}


    //快慢指针  找到去前半部分的末尾
func endOfFirstHalf(head *StrNode) *StrNode  {
   fast := head
   slow := head
   for fast.next != nil && fast.next.next != nil {
      fast = fast.next.next
      slow = slow.next
   }
   fmt.Println(slow)
   return slow
}

//反转链表

func reverseList(head *StrNode)*StrNode  {
   //两个指针 prev,cur。。当cur为空时结束。
   var prev,cur *StrNode = nil,head
   for cur != nil{
      nextTmp := cur.next //把cur.next赋值给nexttmp,下一步断掉cur和cur.next时,不会影响指针移动
      cur.next = prev //指向prev
      prev = cur //移动指针prev
      cur = nextTmp //移动指针cur
   }
   return prev
}


func IsPalindrome01(head *StrNode)bool  {
   if head == nil || head.next == nil{
      return true
   } 
   
   //找到前半部分链表的结尾点并反转链表
   firstHalfEnd := endOfFirstHalf(head)
   secondHalfStart := reverseList(firstHalfEnd.next)

   //判断
   p1 := head
   p2 := secondHalfStart
   result := true
   for result && p2 != nil{
      if p1.str != p2.str{
         result = false
      }
      p1 = p1.next
      p2 = p2.next
   }
   firstHalfEnd.next = reverseList(secondHalfStart)
   return result
}