# 链表理论基础
# 单链表
链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向 null。
# 双链表
有两个指针域,一个指向前面一个指后面。
特点:即可以向前查询也可以向后查询。
# 循环链表
循环链表,顾名思义,就是链表首尾相连。
# 构造链表
1 | public class ListNode { |
# 203. 移除链表元素
# 题目:删除链表中等于给定值 val 的所有节点。
示例 1: 输入:head = [1,2,6,3,4,5,6], val = 6 输出:[1,2,3,4,5]
示例 2: 输入:head = [], val = 1 输出:[]
示例 3: 输入:head = [7,7,7,7], val = 7 输出:[]
由于头节点的移除和其他节点不一样,所以要设置虚拟头节点。
1 | /** |
# 707. 设计链表
# 单链表中的节点应该具备两个属性: val
和 next
。 val
是当前节点的值, next
是指向下一个节点的指针 / 引用。
# 实现 MyLinkedList
类:
-
#
MyLinkedList()
初始化MyLinkedList
对象。 -
#
int get(int index)
获取链表中下标为index
的节点的值。如果下标无效,则返回-1
。 -
#
void addAtHead(int val)
将一个值为val
的节点插入到链表中第一个元素之前。在插入完成后,新节点会成为链表的第一个节点。 -
#
void addAtTail(int val)
将一个值为val
的节点追加到链表中作为链表的最后一个元素。 -
#
void addAtIndex(int index, int val)
将一个值为val
的节点插入到链表中下标为index
的节点之前。如果index
等于链表的长度,那么该节点会被追加到链表的末尾。如果index
比长度更大,该节点将 不会插入 到链表中。 -
#
void deleteAtIndex(int index)
如果下标有效,则删除链表中下标为index
的节点。
注意:头节点从 0 开始。
易犯错:空指针异常。
1 | class ListNode { |
这题不熟练!!!!被绕晕了,明天再看看
# 206. 反转链表
文章链接:https://programmercarl.com/0206. 翻转链表.html# 算法公开课
我的想法:用 for 循环一个接着一个反转(双指针)
# 双指针写法
1 | /** |
注意:cru 一直指向 pre。
总结:学习了三个小时,今天学的有点懵。