golang 链表

发布时间:2024-12-23 06:29:30

链表是计算机科学中常用的数据结构之一。它由一系列节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。相比于数组,链表具有更高的灵活性和效率。本文将介绍golang中链表的基本概念和使用方法。

1. 创建链表

首先,我们需要定义一个节点的结构体。

type ListNode struct {
    Val int
    Next *ListNode
}

这个结构体有两个字段:Val表示节点的值,Next是一个指向下一个节点的指针。通过这样定义的节点结构体,我们就可以创建一个新的链表。

func createLinkedList(nums []int) *ListNode {
    if len(nums) == 0 {
        return nil
    }
    head := &ListNode{nums[0], nil}
    prev := head
    for i := 1; i < len(nums); i++ {
        node := &ListNode{nums[i], nil}
        prev.Next = node
        prev = node
    }
    return head
}

以上代码通过遍历nums数组,依次创建节点,并通过Next指针连接这些节点,最后返回链表的头节点。

2. 遍历链表

遍历链表是一种常见的操作,可以用于查找特定节点或者进行其他操作。下面是一个示例代码,用于遍历并打印链表中每个节点的值。

func printLinkedList(head *ListNode) {
    cur := head
    for cur != nil {
        fmt.Printf("%d ", cur.Val)
        cur = cur.Next
    }
}

通过不断将cur指针指向下一个节点,直到cur为nil,就可以遍历整个链表。

3. 链表的常见操作

除了遍历之外,链表还支持插入、删除和查找等常见操作。下面我们分别介绍这些操作。

3.1 插入节点

要在链表中插入一个节点,我们需要先找到要插入位置的前一个节点。然后,将前一个节点的Next指针指向要插入的节点,将要插入的节点的Next指针指向前一个节点的下一个节点。

func insertNode(prev *ListNode, node *ListNode) {
    node.Next = prev.Next
    prev.Next = node
}

该函数接收一个prev指针和一个要插入的节点作为参数,将节点插入prev后面的位置。

3.2 删除节点

要删除链表中的一个节点,我们需要先找到要删除节点的前一个节点,然后将前一个节点的Next指针指向要删除的节点的下一个节点。

func deleteNode(prev *ListNode) {
    prev.Next = prev.Next.Next
}

该函数接收一个prev指针作为参数,删除prev后面的节点。

3.3 查找节点

要在链表中查找一个特定的节点,我们可以使用遍历操作来逐个比较节点的值,找到就返回该节点。

func findNode(head *ListNode, target int) *ListNode {
    cur := head
    for cur != nil {
        if cur.Val == target {
            return cur
        }
        cur = cur.Next
  &

相关推荐