利用快慢指针求链表的中值

思想:慢指针slow遍历链表,faster指针速度是slow的两倍,则当快指针到达链表结尾时(next节点为空),此时slow指针应该位于链表的中间(链表元素个数是奇数时正中间,偶数应该是一半加1)。

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;i2;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)

你可能感兴趣的:(数据结构,golang学习)