链表刷题日记

138 阅读2分钟

引言

数组和链表都是线性数据结构,数组是连续的内存空间,而链表内存空间的存储是非连续的。目前考的比较多的题是环形链表、链表相交节点,有序链表合并。

链表定义

链表以节点为单位,每个元素都是一个独立对象,在内存空间的存储是非连续的。单链表的节点对象具有两个成员变量:「值 Val」,「后继节点引用 Next」 。

type ListNode struct{
    Val int
    Next *ListNode
}

如下图所示,建立此链表需要实例化每个节点,并构建各节点的引用指向。

// 实例化节点
n1 := &ListNode{Val: 4, Next: nil} // 节点 head
n2 := &ListNode{Val: 5, Next: nil}
n3 := &ListNode{Val: 1, Next: nil}

// 构建引用指向
n1.Next = n2
n2.Next = n3

image.png

双链表

// 节点结构体
type ListNode struct {
    Val int
    Next *ListNode
    Pre *ListNode
}

双链表:每一个节点有两个指针域,一个指向下一个节点,一个指向上一个节点。

双链表 既可以向前查询也可以向后查询。

如图所示: 链表2

循环链表

循环链表,即首尾相连。

循环链表可以用来解决约瑟夫环问题。

链表4

删除链表的节点

如果使用C,C++编程语言的话,删除节点时,不要仅仅修改指针指向,还要从内存中删除移除的节点, 清理节点内存。

如果使用Go,java ,python的话就不用手动管理内存了。

image.png

必刷题

707. 设计链表

203. 移除链表元素

206. 反转链表

21. 合并两个有序链表

23. 合并K个升序链表

24. 两两交换链表中的节点

image.png

19. 删除链表的倒数第 N 个结点

面试题 02.07. 链表相交

142. 环形链表 II