• 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]
    }
    

      执行结果如下:

  • 相关阅读:
    一网友推荐的书:框架设计(第2版):CLR Via C#
    线程与WinForm设计,防冻结,卡住窗体
    通用数据库操作辅助类DbHelper
    高级着色器语言(High Level Shader Language,简称HLSL)
    无法将 匿名方法 转换为类型“System.Delegate”,因为它不是委托类型
    根据RGB,计算灰度值
    温故而知新:WinForm/Silverlight多线程编程中如何更新UI控件的值
    [原创视频]PHP在netbeans中的简单使用
    自己封装的ASP.NET的SQLITE数据库的操作类
    《JavaScript征途》读后感
  • 原文地址:https://www.cnblogs.com/waitmoon/p/13923304.html
Copyright © 2020-2023  润新知