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