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

Posted waitmoon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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]
}

  执行结果如下:

技术图片

 








以上是关于2020-11-03:手写代码:链表如何快速找到中间节点?的主要内容,如果未能解决你的问题,请参考以下文章

手写数据结构:链表

如何快速使用Python神经网络识别手写字符?(文末福利)

148.排序链表

如何快速将手写数据录入 Excel

如何快速将手写数据录入 Excel

手写LinkedList