zoukankan      html  css  js  c++  java
  • 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代码
    评论

  • 相关阅读:
    Spring 签名加密+xml数据交互
    Spring 使用 RestTemplate 模拟 电商网站+支付平台
    SSM 框架搭建
    SpringMVC 登录验证实例
    四.Mybatis 动态sql语句
    三.Mybatis 多对一与一对多
    二.Mybatis 增删改查
    一.Mybatis 入门
    SSH框架搭建
    二)Spring AOP编程思想与动态代理
  • 原文地址:https://www.cnblogs.com/waitmoon/p/14635137.html
Copyright © 2011-2022 走看看