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

举报
福大大架构师每日一题 发表于 2020/11/03 23:26:43 2020/11/03
【摘要】 福哥答案2020-11-03:1.输入链表头节点,奇数长度返回中点,偶数长度返回上中点 。1.1.快慢指针。1.2.单指针。1.3.数组。2.输入链表头节点,奇数长度返回中点,偶数长度返回下中点 。这道题是leetcode上的第876道题,叫【链表的中间节点】。2.1.快慢指针。2.2.单指针。2.3.数组。golang代码如下:package mainimport "fmt"func ma...

福哥答案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]
}

执行结果如下:

image.png

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。