mirror of
https://github.com/halfrost/LeetCode-Go.git
synced 2025-07-03 23:48:31 +08:00
83 lines
1.4 KiB
Go
83 lines
1.4 KiB
Go
package structures
|
||
|
||
import (
|
||
"fmt"
|
||
)
|
||
|
||
// ListNode 是链接节点
|
||
// 这个不能复制到*_test.go文件中。会导致Travis失败
|
||
type ListNode struct {
|
||
Val int
|
||
Next *ListNode
|
||
}
|
||
|
||
// List2Ints convert List to []int
|
||
func List2Ints(head *ListNode) []int {
|
||
// 链条深度限制,链条深度超出此限制,会 panic
|
||
limit := 100
|
||
|
||
times := 0
|
||
|
||
res := []int{}
|
||
for head != nil {
|
||
times++
|
||
if times > limit {
|
||
msg := fmt.Sprintf("链条深度超过%d,可能出现环状链条。请检查错误,或者放宽 l2s 函数中 limit 的限制。", limit)
|
||
panic(msg)
|
||
}
|
||
|
||
res = append(res, head.Val)
|
||
head = head.Next
|
||
}
|
||
|
||
return res
|
||
}
|
||
|
||
// Ints2List convert []int to List
|
||
func Ints2List(nums []int) *ListNode {
|
||
if len(nums) == 0 {
|
||
return nil
|
||
}
|
||
|
||
l := &ListNode{}
|
||
t := l
|
||
for _, v := range nums {
|
||
t.Next = &ListNode{Val: v}
|
||
t = t.Next
|
||
}
|
||
return l.Next
|
||
}
|
||
|
||
// GetNodeWith returns the first node with val
|
||
func (l *ListNode) GetNodeWith(val int) *ListNode {
|
||
res := l
|
||
for res != nil {
|
||
if res.Val == val {
|
||
break
|
||
}
|
||
res = res.Next
|
||
}
|
||
return res
|
||
}
|
||
|
||
// Ints2ListWithCycle returns a list whose tail point to pos-indexed node
|
||
// head's index is 0
|
||
// if pos = -1, no cycle
|
||
func Ints2ListWithCycle(nums []int, pos int) *ListNode {
|
||
head := Ints2List(nums)
|
||
if pos == -1 {
|
||
return head
|
||
}
|
||
c := head
|
||
for pos > 0 {
|
||
c = c.Next
|
||
pos--
|
||
}
|
||
tail := c
|
||
for tail.Next != nil {
|
||
tail = tail.Next
|
||
}
|
||
tail.Next = c
|
||
return head
|
||
}
|