插入简单的单个链接列表

时间:2018-02-08 21:34:54

标签: go data-structures linked-list

我正在尝试解决Go中的leetcode问题来自学语言。我有一个链表和一个插入函数:

type ListNode struct {
    Val int
    Next * ListNode
}


func Insert(listNode * ListNode, i int) {
    // @fixme how to check the first node?
    if listNode == nil {
        listNode.Val = i
        listNode.Next = nil
    } else {
        for;;
        listNode = listNode.Next {
            if listNode.Next == nil {
                listNode.Next = & ListNode {
                    i, nil
                }
                break
            }
        }
    }
}

func main() {

    vals: = [] int {
            1, 2, 3, 4, 5
        }
    var list ListNode
    for _,
    i: = range vals {
        Insert( & list, i)
    }
}

问题是当实例化ListNode的实例时,struct字段的值为零,我无法更新列表的第一个元素,因为我无法检查它。换句话说,ListNode项已初始化但为空。因此,当我想构建一个列表1->2->3->4->5时,我最终得到:0->1 ->2 ...5。限制是我无法更改结构定义,因为leetcode已经定义了。 以下是上述代码的工作示例: https://play.golang.org/p/bIz-VjY1PS7

1 个答案:

答案 0 :(得分:1)

你应该做的是你不应该使用ListNode你应该使用*ListNode,这样一个空列表由nil *ListNode表示:< / p>

func New() *ListNode {
    return nil
}

func Insert(listNode *ListNode, i int) *ListNode {
    // If it's nil, create it
    if listNode == nil {
        listNode = &ListNode{i, nil}
    } else {
        l := listNode
        for ; l.Next != nil; l = l.Next {
        }
        l.Next = &ListNode{i, nil}
    }
    return listNode
}