2020-11-03:手写代码:链表如何快速找到中间节点?

福哥答案2020-11-03:

1.输入链表头节点,奇数长度返回中点,偶数长度返回上中点 。
1.1.快慢指针。
1.2.单指针。
1.3.数组。
2.输入链表头节点,奇数长度返回中点,偶数长度返回下中点 。这道题是leetcode上的第876道题,叫【链表的中间节点】。
2.1.快慢指针。
2.2.单指针。
2.3.数组。

golang代码如下:

package main

import "fmt"

func main() {
    if true {
        fmt.Println(2)
        head := &ListNode{}
        node := head
        node.Val = 0

        node.Next = &ListNode{}
        node = node.Next
        node.Val = 1

        fmt.Println(middleNode1_1(head), "偶上中,快慢指针")
        fmt.Println(middleNode1_2(head), "偶上中,单指针")
        fmt.Println(middleNode1_3(head), "偶上中,数组")

        fmt.Println(middleNode2_1(head), "偶下中,快慢指针")
        fmt.Println(middleNode2_2(head), "偶下中,单指针")
        fmt.Println(middleNode2_3(head), "偶下中,数组")

    }
    if true {
        fmt.Println("---------------")
        fmt.Println(3)
        head := &ListNode{}
        node := head
        node.Val = 0

        node.Next = &ListNode{}
        node = node.Next
        node.Val = 1

        node.Next = &ListNode{}
        node = node.Next
        node.Val = 2

        fmt.Println(middleNode1_1(head), "偶上中,快慢指针")
        fmt.Println(middleNode1_2(head), "偶上中,单指针")
        fmt.Println(middleNode1_3(head), "偶上中,数组")

        fmt.Println(middleNode2_1(head), "偶下中,快慢指针")
        fmt.Println(middleNode2_2(head), "偶下中,单指针")
        fmt.Println(middleNode2_3(head), "偶下中,数组")

    }
    if true {

        fmt.Println("---------------")
        fmt.Println(1)
        head := &ListNode{}
        node := head
        node.Val = 0

        fmt.Println(middleNode1_1(head), "偶上中,快慢指针")
        fmt.Println(middleNode1_2(head), "偶上中,单指针")
        fmt.Println(middleNode1_3(head), "偶上中,数组")

        fmt.Println(middleNode2_1(head), "偶下中,快慢指针")
        fmt.Println(middleNode2_2(head), "偶下中,单指针")
        fmt.Println(middleNode2_3(head), "偶下中,数组")

    }
}

type ListNode struct {
    Val  int
    Next *ListNode
}

//1.输入链表头节点,奇数长度返回中点,偶数长度返回上中点 。
//快慢指针
func middleNode1_1(head *ListNode) *ListNode {
    pre := &ListNode{} //虚拟头节点
    pre.Next = head
    pre.Val = 1

    slow := pre
    fast := pre
    for fast != nil && fast.Next != nil {
        slow = slow.Next
        fast = fast.Next.Next
    }

    return slow
}

//1.输入链表头节点,奇数长度返回中点,偶数长度返回上中点 。
//单指针
func middleNode1_2(head *ListNode) *ListNode {
    n := 0
    cur := head
    for cur != nil {
        n++
        cur = cur.Next
    }

    k := 0
    cur = head
    n = (n - 1) / 2
    for k < n {
        k++
        cur = cur.Next
    }

    return cur
}

//1.输入链表头节点,奇数长度返回中点,偶数长度返回上中点 。
//数组
func middleNode1_3(head *ListNode) *ListNode {
    list := make([]*ListNode, 0)

    for head != nil {
        list = append(list, head)
        head = head.Next
    }

    return list[(len(list)-1)/2]
}

//2.输入链表头节点,奇数长度返回中点,偶数长度返回下中点 。这道题是leetcode上的第876道题,叫【链表的中间节点】。
//快慢指针
func middleNode2_1(head *ListNode) *ListNode {
    slow := head
    fast := head
    for fast != nil && fast.Next != nil {
        slow = slow.Next
        fast = fast.Next.Next
    }

    return slow
}

//2.输入链表头节点,奇数长度返回中点,偶数长度返回下中点 。这道题是leetcode上的第876道题,叫【链表的中间节点】。
//单指针
func middleNode2_2(head *ListNode) *ListNode {
    n := 0
    cur := head
    for cur != nil {
        n++
        cur = cur.Next
    }
    k := 0
    cur = head
    n /= 2
    for k < n {
        k++
        cur = cur.Next
    }
    return cur
}

//2.输入链表头节点,奇数长度返回中点,偶数长度返回下中点 。这道题是leetcode上的第876道题,叫【链表的中间节点】。
//数组
func middleNode2_3(head *ListNode) *ListNode {
    list := make([]*ListNode, 0)
    for head != nil {
        list = append(list, head)
        head = head.Next
    }
    return list[len(list)/2]
}

执行结果如下:
图片说明

福大大架构师每日一题 文章被收录于专栏

最新面试题,针对高级开发人员和架构师。内容是后端、大数据和人工智能。

全部评论

相关推荐

刚刷到字节跳动官方发的消息,确实被这波阵仗吓了一跳。在大家还在纠结今年行情是不是又“寒冬”的时候,字节直接甩出了史上规模最大的转正实习计划——ByteIntern。咱们直接看几个最硬的数,别被花里胡哨的宣传词绕晕了。首先是“量大”。全球招7000多人是什么概念?这几乎是把很多中型互联网公司的总人数都给招进来了。最关键的是,这次的资源分配非常精准:研发岗给了4800多个Offer,占比直接超过六成。说白了,字节今年还是要死磕技术,尤其是产品和AI领域,这对于咱们写代码的同学来说,绝对是今年最厚的一块肥肉。其次是大家最关心的“转正率”。官方直接白纸黑字写了:整体转正率超过50%。这意味着只要你进去了,不划水、正常干,每两个人里就有一个能直接拿校招Offer。对于2027届(2026年9月到2027年8月毕业)的同学来说,这不仅是实习,这简直就是通往大厂的快捷通道。不过,我也得泼盆冷水。坑位多,不代表门槛低。字节的实习面试出了名的爱考算法和工程实操,尤其是今年重点倾斜AI方向,如果你简历里有和AI相关的项目,优势还是有的。而且,转正率50%也意味着剩下那50%的人是陪跑的,进去之后的考核压力肯定不小。一句话总结:&nbsp;27届的兄弟们,别犹豫了。今年字节这是铁了心要抢提前批的人才,现在投递就是占坑。与其等到明年秋招去千军万马挤独木桥,不如现在进去先占个工位,把转正名额攥在手里。
喵_coding:别逗了 50%转正率 仔细想想 就是转正与不转正
字节7000实习来了,你...
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务