• 2021-04-08:给定一个单链表的头节点head,请判断该链表是否为回文结构。


    2021-04-08:给定一个单链表的头节点head,请判断该链表是否为回文结构。

    福大大 答案2021-04-08:

    1.找中点。
    2.按中点切分成两个链表。
    3.反转右边链表。
    4.相等判断。
    5.反转右边链表。
    6.左右链表合并。
    7.返回true或者false。

    代码用golang编写。代码如下:

    package main
    
    import "fmt"
    
    func main() {
        head := &ListNode{Val: 1}
        head.Next = &ListNode{Val: 2}
        head.Next.Next = &ListNode{Val: 3}
        head.Next.Next.Next = &ListNode{Val: 3}
        head.Next.Next.Next.Next = &ListNode{Val: 2}
        head.Next.Next.Next.Next.Next = &ListNode{Val: 1}
        printlnLinkNodeList(head)
        ret := isPalindrome(head)
        printlnLinkNodeList(head)
        fmt.Println(ret)
    }
    
    //Definition for singly-linked list.
    type ListNode struct {
        Val  int
        Next *ListNode
    }
    
    //链表打印
    func printlnLinkNodeList(head *ListNode) {
        cur := head
        for cur != nil {
            fmt.Print(cur.Val, "	")
            cur = cur.Next
        }
        fmt.Println()
    }
    
    //获取中点
    func GetMid(head *ListNode) *ListNode {
        fast := head
        slow := head
        if 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
        var next *ListNode
        for cur != nil {
            next = cur.Next
            cur.Next = pre
            //准备下一次循环
            pre, cur = cur, next
        }
        return pre
    }
    
    func isPalindrome(head *ListNode) bool {
        if head == nil || head.Next == nil {
            return true
        }
        //找中点
        mid := GetMid(head)
        //切断成两个链表
        rStart := mid.Next
        mid.Next = nil
        //反转右边链表
        rEnd := Reverse(rStart)
        //相等判断
        n1 := head
        n2 := rEnd
        ans := true
        for n1 != nil && n2 != nil {
            if n1.Val != n2.Val {
                ans = false
                break
            }
            n1, n2 = n1.Next, n2.Next
        }
    
        //反转右边链表
        Reverse(rEnd)
    
        //左右链表合并
        mid.Next = rStart
    
        return ans
    }
    

    执行结果如下:
    在这里插入图片描述


    左神java代码
    评论

  • 相关阅读:
    ActiveReport换页的判断(当设置了repeatstyle为OnPage)
    创建与删除SQL约束或字段约束。 http://www.cnblogs.com/hanguoji/archive/2006/11/17/563871.html
    在SQL Server 2005中实现表的行列转换
    ActiveReport,Detail隐藏的问题
    SQL Server identity列的操作方法
    「預り」の意味
    POJ 1595 Prime Cuts
    Hdu Graph’s Cycle Component
    POJ 3250 Bad Hair Day
    Hdu 1548 A strange lift(BFS)
  • 原文地址:https://www.cnblogs.com/waitmoon/p/14635137.html
Copyright © 2020-2023  润新知