思想:慢指针slow遍历链表,faster指针速度是slow的两倍,则当快指针到达链表结尾时(next节点为空),此时slow指针应该位于链表的中间(链表元素个数是奇数时正中间,偶数应该是一半加1)。
```go
package main
import (
"math/rand"
"time"
"fmt"
)
func main() {
p:=Initlist(10)
Traverse(p)
data,index:=Middle(p)
fmt.Printf("中值:%d,位置在%d",data,index)
}
//节点定义
type pnode struct {
data int
next *pnode
}
//初始化长度为n的链表
func Initlist(n int)*pnode{
rand.Seed(time.Now().UnixNano())
pFirst:=&pnode{data:rand.Intn(2n)}
pLast:=&pnode{data:rand.Intn(2n)}
pFirst.next=pLast
for i:=0;i<n-2;i++{
pLast.next=&pnode{data:rand.Intn(2n)}
pLast=pLast.next
}
return pFirst
}
//利用快慢指针求中值
func Middle(p *pnode)(int,int){
slow,faster:=p,p
count:=0
for{
if faster!=nil&&faster.next!=nil{
count++
slow=slow.next
faster=faster.next.next
}else{
break
}
}
return slow.data,count
}
//遍历链表
func Traverse(p *pnode){
for{
if p==nil{
return
}
fmt.Println(p.data)
p=p.next
}
}
> 性能表现: 时间复杂度:O(n) 空间复杂度:O(1)